【发布时间】:2020-10-03 10:36:32
【问题描述】:
您好,我曾尝试在 WebGL 中同时绘制不同的图形,但它只绘制第一个图形。我对 WebGL 很陌生。我不知道问题是不是因为我没有使用缓冲区(因为我必须这样做)或着色器。
但我认为我为每个图形使用不同的缓冲区,因为我传入函数“模型”,然后我执行 model.Idbuffer...所以我想我为每个图形创建一个缓冲区。
任何帮助都非常感谢。
这是我的代码。
var gl = null;
var program;
var x = 0;
var y = 0;
var z = 0;
var radi = 0;
var nombre_costats = 100;
var figura = {
"vertices" : [-0.2, -0.2 , 0.0,
-0.2, -0.1, 0.0,
-0.4, -0.1, 0.0,
-0.4, -0.2, 0.0,
-0.5, -0.2, 0.0,
-0.5, 0.0, 0.0,
-0.2, 0.0, 0.0,
-0.2, 0.2, 0.0,
0.3, 0.2, 0.0,
0.3, 0.0, 0.0,
0.4, 0.0, 0.0,
0.4, -0.2, 0.0,
0.3, -0.2, 0.0,
0.3, -0.1, 0.0,
0.1, -0.1, 0.0,
0.1, -0.2, 0.0,],
"indices" : [0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 0]
};
var poligon = {
"vertices" : [],
"indices" : []
};
function dibuixar_cercle(x, y, z, radi, nombre_costats, poligon){
var nombre_vertex = nombre_costats + 2;
poligon.vertices.push(0);
poligon.vertices.push(0);
poligon.vertices.push(0);
for (var i = 1; i<nombre_vertex; i++){
poligon.vertices.push(x + radi * Math.cos( i * (2 * Math.PI) / nombre_costats));
poligon.vertices.push(y + radi * Math.sin( i * (2 * Math.PI) / nombre_costats));
poligon.vertices.push(0);
if (i>=2){
poligon.indices.push(0);
poligon.indices.push(i-1);
poligon.indices.push(i);
}
}
}
function getWebGLContext() {
var canvas = document.getElementById("myCanvas");
try {
return canvas.getContext("webgl2");
}
catch(e) {
}
return null;
}
function initShaders() {
// paso 1
var vertexShader = gl.createShader(gl.VERTEX_SHADER);
gl.shaderSource(vertexShader, document.getElementById('myVertexShader').text);
gl.compileShader(vertexShader);
var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
gl.shaderSource(fragmentShader, document.getElementById('myFragmentShader').text);
gl.compileShader(fragmentShader);
// paso 2
program = gl.createProgram();
gl.attachShader(program, vertexShader);
gl.attachShader(program, fragmentShader);
// paso 3
gl.linkProgram(program);
gl.useProgram(program);
program.vertexPositionAttribute = gl.getAttribLocation( program, "VertexPosition");
gl.enableVertexAttribArray(program.vertexPositionAttribute);
}
function initRendering() {
gl.clearColor(0.0,0.0,1.0,1.0);
}
function initBuffers(model) {
model.idBufferVertices = gl.createBuffer ();
gl.bindBuffer (gl.ARRAY_BUFFER, model.idBufferVertices);
gl.bufferData (gl.ARRAY_BUFFER, new Float32Array(model.vertices), gl.STATIC_DRAW);
model.idBufferIndices = gl.createBuffer ();
gl.bindBuffer (gl.ELEMENT_ARRAY_BUFFER, model.idBufferIndices);
gl.bufferData (gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(model.indices), gl.STATIC_DRAW);
}
function draw(model) {
gl.bindBuffer(gl.ARRAY_BUFFER, model.idBufferVertices);
gl.vertexAttribPointer(program.vertexPositionAttribute, 3, gl.FLOAT, false, 0, 0);
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, model.idBufferIndices);
gl.drawElements(gl.LINE_LOOP, 32, gl.UNSIGNED_SHORT, 0);
}
function draw2(model) {
gl.bindBuffer(gl.ARRAY_BUFFER, model.idBufferVertices);
gl.vertexAttribPointer(program.vertexPositionAttribute, 3, gl.FLOAT, false, 0, 0);
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, model.idBufferIndices);
gl.drawElements(gl.TRIANGLE, nombre_costats*3 , gl.UNSIGNED_SHORT, 0);
}
function drawScene() {
gl.clear(gl.COLOR_BUFFER_BIT);
draw(figura);
draw2(poligon);
}
function initWebGL() {
var costats = 100;
var radi = 0.1;
var x_centre = 0;
var y_centre = 0;
var z_centre = 0;
gl = getWebGLContext();
if (!gl) {
alert("WebGL 2.0 no está disponible");
return;
}
initShaders();
dibuixar_cercle(x_centre, y_centre, z_centre, radi, costats, poligon);
console.log(figura);
initBuffers(figura);
initBuffers(poligon);
console.log(poligon);
initRendering();
requestAnimationFrame(drawScene);
}
initWebGL();
```
【问题讨论】:
标签: javascript webgl