AnsweredAssumed Answered

glDrawArraysIndirect not setting gl_VertexID correctly?

Question asked by soconnell Employee on Jul 26, 2013
Latest reply on Jul 26, 2013 by cameni

I'm not 100% positive what the correct behavior is here, but on NVIDIA hardware, gl_VertexID = first + [vertex index].  So if I specify first=2, count = 6, then the values for gl_VertexID in each instance of the shader are: 2, 3, 4, 5, 6, 7.  However on AMD hardware, gl_VertexID always starts at 0.  When calling glDrawArrays with no bound attributes, the behavior between NVIDIA and AMD is the same and correct.  Has anybody else experienced this issue on AMD hardware?

 

//-------------------------Create and set up indirect draw buffer-------------------------

typedef struct

{

    GLuint count;

    GLuint primCount;

    GLuint first;

    GLuint baseInstance;

} DrawArraysIndirectCommand;

 

DrawArraysIndirectCommand command;

command.count = 6;

command.primCount= 1;

command.first = 2;

command.baseInstance = 0;

 

glGenBuffers(1, &indirectBuffer);

glBindBuffer(GL_DRAW_INDIRECT_BUFFER, indirectBuffer);

glBufferData(GL_DRAW_INDIRECT_BUFFER, sizeof(DrawArraysIndirectCommand), &command, GL_STATIC_DRAW);

glBindBuffer(GL_DRAW_INDIRECT_BUFFER, 0);

 

//-------------------------Make indirect draw call-------------------------

glBindVertexArray(dummyVao);

glBindBuffer(GL_DRAW_INDIRECT_BUFFER, indirectBuffer);

glDrawArraysIndirect(GL_POINTS, 0);

glBindBuffer(GL_DRAW_INDIRECT_BUFFER, 0);

glBindVertexArray(0);

 

 

//-------------------------VERTEX SHADER--------------------------

#version 430 core

 

layout (std430, binding = 0) buffer BufferObject

{

    int data[];

};

 

uniform mat4 ModelViewProjectionMatrix;

 

void main()

{

    data[gl_VertexID] = gl_VertexID;

    gl_Position = ModelViewProjectionMatrix * vec4(gl_VertexID, 0.0, 0.0, 1.0);

}

Outcomes