1

x 座標がゼロの頂点バッファーをレンダリングすると、次の 2 つのシェーダーが異なる結果を生成する理由がわかりません。

初め:

attribute vec3 position;

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

2番:

attribute vec3 position;

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

最初の結果は、9 つ​​のドットの行です。2 番目の結果は 1 つのドットです。

次の頂点配列を 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 コンパイラは、最初のコンポーネントが使用されていないため、属性 'position' が使用されていないと見なします。これを確認するには、次のテストを試してください。

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

バグを確認したら、ビデオ ドライバーを更新するか、明白な回避策を使用できます。

于 2011-02-07T22:12:11.043 に答える