smani
12-03-2010, 07:02 AM
Hello, I was wondering, is a VAO supposed to be able to keep track of shader attribute pointers to multiple programs?
I.e. consider the following code:
glGenBuffers(1, &model.vertices);
glBindBuffer(GL_ARRAY_BUFFER, model.vertices);
glBufferData(GL_ARRAY_BUFFER, model.n_vertices*4*sizeof(float), shape.vertices, GL_STATIC_DRAW);
glUseProgram(drawprog.program);
glVertexAttribPointer(drawprog.vertexLocation, 4, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(drawprog.vertexLocation) ;
glUseProgram(shadowprog.program);
glVertexAttribPointer(shadowprog.vertexLocation, 4, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(shadowprog.vertexLocatio n);
glGenBuffers(1, &model.normals);
glBindBuffer(GL_ARRAY_BUFFER, model.normals);
glBufferData(GL_ARRAY_BUFFER, model.n_vertices*3*sizeof(float), shape.normals, GL_STATIC_DRAW);
glUseProgram(drawprog.program);
glVertexAttribPointer(drawprog.normalLocation, 3, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(drawprog.normalLocation) ;
glGenBuffers(1, &model.indices);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, model.indices);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, model.n_indices*sizeof(unsigned), shape.indices, GL_STATIC_DRAW);
glBindVertexArray(0);
This code renders correctly with nVidia proprietary drivers, but fails with ATI proprietary drivers as well as intel mesa drivers. Specifically, the shadowprog only draws the last of a list of primitives aka. models, while the drawprog draws correctly. If I comment out the block setting the normal attribute pointer for the drawprog, the shadowprog draws correctly on all GPUs (the drawprog obviously not).
Can anyone clarify?
Thanks!
smani
I.e. consider the following code:
glGenBuffers(1, &model.vertices);
glBindBuffer(GL_ARRAY_BUFFER, model.vertices);
glBufferData(GL_ARRAY_BUFFER, model.n_vertices*4*sizeof(float), shape.vertices, GL_STATIC_DRAW);
glUseProgram(drawprog.program);
glVertexAttribPointer(drawprog.vertexLocation, 4, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(drawprog.vertexLocation) ;
glUseProgram(shadowprog.program);
glVertexAttribPointer(shadowprog.vertexLocation, 4, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(shadowprog.vertexLocatio n);
glGenBuffers(1, &model.normals);
glBindBuffer(GL_ARRAY_BUFFER, model.normals);
glBufferData(GL_ARRAY_BUFFER, model.n_vertices*3*sizeof(float), shape.normals, GL_STATIC_DRAW);
glUseProgram(drawprog.program);
glVertexAttribPointer(drawprog.normalLocation, 3, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(drawprog.normalLocation) ;
glGenBuffers(1, &model.indices);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, model.indices);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, model.n_indices*sizeof(unsigned), shape.indices, GL_STATIC_DRAW);
glBindVertexArray(0);
This code renders correctly with nVidia proprietary drivers, but fails with ATI proprietary drivers as well as intel mesa drivers. Specifically, the shadowprog only draws the last of a list of primitives aka. models, while the drawprog draws correctly. If I comment out the block setting the normal attribute pointer for the drawprog, the shadowprog draws correctly on all GPUs (the drawprog obviously not).
Can anyone clarify?
Thanks!
smani