【发布时间】:2020-06-01 21:31:13
【问题描述】:
我正在尝试使用基于 this guide 的 WebGL 实例化。我试图创建一个简单的示例,在左侧绘制一个红色三角形,在右侧绘制一个蓝色三角形。当我运行它时,它在左侧绘制了一个蓝色三角形,我不明白为什么。
我尝试将参数更改为drawArraysInstancedANGLE,但这并没有帮助。我尝试更改绑定缓冲区和设置属性指针等的行顺序。我做错了什么?谢谢
const canvas = document.getElementById("canvas");
const gl = canvas.getContext("webgl");
const ext = gl.getExtension("ANGLE_instanced_arrays");
const vert = gl.createShader(gl.VERTEX_SHADER);
const frag = gl.createShader(gl.FRAGMENT_SHADER);
const program = gl.createProgram();
gl.shaderSource(vert, `
attribute vec4 a_position;
attribute vec4 a_color;
varying vec4 v_color;
void main() {
gl_Position = a_position;
v_color = a_color;
}
`);
gl.shaderSource(frag, `
precision mediump float;
varying vec4 v_color;
void main() {
gl_FragColor = v_color;
}
`);
gl.compileShader(vert);
gl.compileShader(frag);
gl.attachShader(program, vert);
gl.attachShader(program, frag);
gl.linkProgram(program);
const a_position = gl.getAttribLocation(program, "a_position");
const buffer1 = gl.createBuffer();
const positions = [-0.5, 0, -0.5, 0.2, -0.3, 0, 0.5, 0, 0.5, 0.2, 0.3, 0];
gl.bindBuffer(gl.ARRAY_BUFFER, buffer1);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(positions), gl.STATIC_DRAW);
const a_color = gl.getAttribLocation(program, "a_color");
const buffer2 = gl.createBuffer();
const colors = [1, 0, 0, 1, 0, 0, 1, 1];
gl.bindBuffer(gl.ARRAY_BUFFER, buffer2);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(colors), gl.STATIC_DRAW);
gl.viewport(0, 0, 300, 300);
gl.useProgram(program);
gl.bindBuffer(gl.ARRAY_BUFFER, buffer1);
gl.enableVertexAttribArray(a_position);
gl.vertexAttribPointer(a_position, 2, gl.FLOAT, false, 0, 0);
gl.bindBuffer(gl.ARRAY_BUFFER, buffer2);
gl.enableVertexAttribArray(a_color);
gl.vertexAttribPointer(a_color, 4, gl.FLOAT, false, 0, 0);
ext.vertexAttribDivisorANGLE(a_color, 1);
ext.drawArraysInstancedANGLE(gl.TRIANGLES, 0, 3, 2);
<canvas id="canvas" width="300" height="300"></canvas>
【问题讨论】:
-
请阅读教程直到最后。你错过了
attribute mat4 matrix;。三角形的 2 个实例完全重叠,它们共享相同的位置。 -
在这个例子中我没有使用矩阵。我明确设置了三角形角的位置。我不认为他们有相同的立场。一个出现在屏幕左侧,另一个出现在右侧。当我不使用实例化并在单个 drawArrays 调用中绘制两个三角形时,它可以正常工作(前提是我使颜色缓冲区数据足够大)。
-
你误解了Instancing。再次阅读教程。您有一个三角形的 2 个实例。顶点 4 到 6 根本没有使用。
-
啊,是的,对不起,你是对的。我误解了实例化。我认为它会读取第一个实例的第一个 3x2 值,然后读取第二个实例的第二个 3x2 值,但这不是它的工作原理。相反,它会重复前 3x2 值。为了实现我想要的,我想我需要为顶点数据索引到一个统一的数组中,或者将它放入一个纹理中,如下所示:stackoverflow.com/questions/55319323/… 感谢您的帮助。
标签: javascript webgl