0

頂点シェーダーでの gl_vertexID の動作を理解しようとしています。そのために、2 つの glDrawArrays 呼び出しを次々に使用して 2 つの正方形をレンダリングしようとしています。頂点の gl_VertexID を次のように使用して、1 つの正方形のみに赤い色を適用します。

out vec4 color;
in vec4 tdk_Vertex;

void main(void)
{
if(gl_VertexID < 4)
{
    color = vec4(1.0f, 0.0f, 0.0f, 1.0f);
}
else
{
    color = vec4(1.0f, 1.0f, 1.0f, 1.0f);
}
gl_Position = tdk_Vertex;
}

フラグメント シェーダーに色を渡す。

次のように座標を平方します。

static GLfloat vertices[] =
       { -0.75f, 0.25f, 0.0f, 1.0f,
         -0.75f, 0.5f,  0.0,  1.0f,
         -0.25f, 0.5f,  0.0f, 1.0f,
         -0.25f, 0.25f, 0.0f, 1.0f,

          0.25f, 0.25f, 0.0f, 1.0f,
          0.25f, 0.5f,  0.0f, 1.0f,
          0.75f, 0.5f, 0.0f,  1.0f,
          0.75f, 0.25f, 0.0f, 1.0f};

次のように描画呼び出しを行う:

for(int i=0; i<8; i+=4)
{
     glDrawArrays(GL_TRIANGLE_FAN, i, 4);
 }

Nvidia カードを使用し、2 つの glDrawArrays 呼び出しを呼び出すと、予想される結果が表示されます。つまり、赤色を 1 つの正方形にレンダリングし、白色を別の正方形にレンダリングします。

したがって、この正しい動作を知りたいですか、それとも gl_VertexID インデックスが glDrawArrays 呼び出し中に生成され、両方の正方形が同じ赤色になるようにする必要がありますか?

私は2つのglDrawArrays呼び出しを使用しているので、私の理解では、仕様に従って両方の四角が赤でなければなりません:

http://www.opengl.org/sdk/docs/manglsl/xhtml/gl_VertexID.xml

glsl 300 es でテストしたい。

4

1 に答える 1

1

の場合、glDrawArraysgl_VertexIDバッファ内の頂点のインデックスとなるように意図されています。最初の描画呼び出しは [0, 4) の範囲のインデックスをレンダリングするので、それらが値にgl_VertexIDなります。2 番目の描画呼び出しは範囲 [4, 8) のインデックスをレンダリングし、それらはgl_VertexID取得する値です。

于 2013-02-12T06:31:50.900 に答える