I have to send vertex attributes using glVertexAttribPointer to shaders expecting them as built-in (gl_Vertex
, gl_Color
, etc.).
The glVertexAttribPointer
function needs to specify the index (or location) of each built-in attribute. I can do it on NVidia implementations since the location of each attribute is fixed (see http://www.opengl.org/sdk/docs/tutorials/ClockworkCoders/attributes.php at the section "Custom attributes), however i'm not sure about the locations in ATI implementation.
Also, the function glGetAttribLocation
will return -1 when trying to get the location of any attribute beginning starting with "gl_".
I think i'm missing something and this is a trivial problem, however I have not found the correct solution for ATI.
A vertex attribute is an input variable to a shader that is supplied with per-vertex data. In OpenGL core profile, they are specified as in variables in a vertex shader and are backed by a GL_ARRAY_BUFFER . These variable can contain, for example, positions, normals or texture coordinates.
A Vertex Array Object (VAO) is an OpenGL Object that stores all of the state needed to supply vertex data (with one minor exception noted below). It stores the format of the vertex data as well as the Buffer Objects (see below) providing the vertex data arrays.
The builtin attribute arrays are not set with glVertexAttribPointer
, but with functions like glVertexPointer
, glColorPointer
, .... And you enable these by calling glEnableClientState
with constants like GL_VERTEX_ARRAY
, GL_COLOR_ARRAY
, ..., instead of glEnableVertexAttribArray
.
Whereas on nVidia glVertexAttribPointer
might work, due to their aliasing of custom attribute indices with builtin attributes, this is not standard conformant and I'm sure you cannot expect this on any other hardware vendor. So to be sure use glVertexAttribPointer
for custom attributes and the glVertexPointer/glNormalPointer/...
functions for bultin attributes, together with the matching enable/disable functions.
Keep in mind that the builtin attributes are deprecated anyway, together with the mentioned functions. So if you want to write modern OpenGL code, you should define your own attributes anyway. But maybe you have to support legacy shaders or don't care about forward compatiblity at the moment.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With