我试图理解顶点着色器中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。
答案 0 :(得分:1)
在glDrawArrays
的情况下,gl_VertexID
旨在成为缓冲区内顶点的索引。您的第一次绘制调用会在范围[0,4]上呈现索引,因此这些是gl_VertexID
将采用的值。您的第二次绘制调用会在范围[4,8]上呈现指数,这些是gl_VertexID
将采用的值。