1

我不明白为什么当我渲染一个 x 坐标为零的顶点缓冲区时,以下两个着色器会产生不同的结果:

第一的:

attribute vec3 position;

void main() {
  gl_Position = vec4(position.x, position.y, 0.0, 1.0);
}

第二:

attribute vec3 position;

void main() {
  gl_Position = vec4(0.0, position.y, 0.0, 1.0);
}

第一个结果是一行九个点。第二个的结果是一个点。

我将以下顶点数组绘制为 GL_POINTS:

0.0, -1.00, 0.0,
0.0, -0.75, 0.0,
0.0, -0.50, 0.0,
0.0, -0.25, 0.0,
0.0,  0.00, 0.0,
0.0,  0.25, 0.0,
0.0,  0.50, 0.0,
0.0,  0.75, 0.0,
0.0,  1.00, 0.0

这是VBO准备电话:

var a = new Float32Array([
    0.0, -1.00, 0.0,
    0.0, -0.75, 0.0,
    0.0, -0.50, 0.0,
    0.0, -0.25, 0.0,
    0.0,  0.00, 0.0,
    0.0,  0.25, 0.0,
    0.0,  0.50, 0.0,
    0.0,  0.75, 0.0,
    0.0,  1.00, 0.0
]);
gl.bindBuffer(gl.ARRAY_BUFFER, b);
gl.bufferData(gl.ARRAY_BUFFER, a.byteLength, gl.STATIC_DRAW);
gl.bufferSubData(gl.ARRAY_BUFFER, 0, a);

这是抽奖电话:

gl.bindBuffer(gl.ARRAY_BUFFER, b);
gl.vertexAttribPointer(p.position, 3, gl.FLOAT, false, 0, 0);
gl.enableVertexAttribArray(p.position);
gl.drawArrays(gl.POINTS, 0, 9);
4

1 回答 1

1

这是一个已知问题(抱歉,暂时没有链接)。

基本上,GLSL 编译器认为属性“位置”没有被使用,因为它的第一个组件没有被使用。要检查这一点,请尝试以下测试:

gl_Position = vec4(0.0, position.y, 0.0, 1.0) + position.x*0.001;

确认错误后,您可以更新视频驱动程序或使用明显的解决方法。

于 2011-02-07T22:12:11.043 回答