何时确定要在gl_VertexID中使用的顶点索引

时间:2013-02-11 10:03:01

标签: opengl-es glsles

我试图理解顶点着色器中gl_vertexID的行为。为此,我试图使用两个glDrawArrays调用一个接一个地渲染2个方块。并且想要使用顶点中的gl_VertexID将红色应用于仅一个方格:

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卡,并调用两个glDrawArrays调用显示预期的结果,即将红色渲染为一个正方形,将白色渲染为其他正方形。

因此,想知道glDrawArrays调用期间应该生成这个正确的行为还是gl_VertexID索引,这样两个方块都有相同的红色?

我正在使用2个glDrawArrays调用,所以我的理解是两个方块都应该按照规范为红色:

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

想要测试glsl 300 es。

1 个答案:

答案 0 :(得分:1)

glDrawArrays的情况下,gl_VertexID旨在成为缓冲区内顶点的索引。您的第一次绘制调用会在范围[0,4]上呈现索引,因此这些是gl_VertexID将采用的值。您的第二次绘制调用会在范围[4,8]上呈现指数,这些是gl_VertexID将采用的值。