PDA

View Full Version : glEnableVertexAttribArray - when to call?



PeTeAR
12-08-2011, 12:07 PM
Hi,

Using ES 2.0 on Android (java)

I using multiple VBO's and multiple shaders and using glDrawElements and it works fine...however, I have a question.

This is a piece of code from my draw()->


GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, mVertexCoordsVBO[0]);
GLES20.glVertexAttribPointer(mShader.mVertexCoordH andler, 3, GLES20.GL_FLOAT, false, 0, 0);
GLES20.glEnableVertexAttribArray(mShader.mVertexCo ordHandler);


and this is a piece from my initial setup ->


private void copyVertexCoordsToGPU() {

GLES20.glGenBuffers(1, mVertexCoordsVBO, 0);
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, mVertexCoordsVBO[0]);
GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, mDC.getVertices().capacity()*Float.SIZE/8, mDC.getVertices(), GLES20.GL_STATIC_DRAW);
}

Now, reading about the "glVertexAttribPointer" in the spec, it says "Also, the buffer object binding (GL_ARRAY_BUFFER_BINDING) is saved as generic vertex attribute array client-side state (GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING) for index index."
spec (http://www.khronos.org/opengles/sdk/docs/man/xhtml/glVertexAttribPointer.xml) http://www.khronos.org/opengles/sdk/docs/man/xhtml/glVertexAttribPointer.xml


Does this mean that I should be able to do it this way instead?

In the draw() ->



GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, mVertexCoordsVBO[0]);
// GLES20.glVertexAttribPointer(mShader.mVertexCoordH andler, 3, GLES20.GL_FLOAT, false, 0, 0);
GLES20.glEnableVertexAttribArray(mShader.mVertexCo ordHandler);


and in the init setup ->


private void copyVertexCoordsToGPU() {

GLES20.glGenBuffers(1, mVertexCoordsVBO, 0);
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, mVertexCoordsVBO[0]);
GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, mDC.getVertices().capacity()*Float.SIZE/8, mDC.getVertices(), GLES20.GL_STATIC_DRAW);
GLES20.glVertexAttribPointer(mShader.mVertexCoordH andler, 3, GLES20.GL_FLOAT, false, 0, 0);
}

It doesn't work for me though....and the question is if this should be possible or if I have missunderstood something.

Thanks
Peter

BionicBytes
12-08-2011, 01:05 PM
No you had it right the first time round.

PeTeAR
12-08-2011, 01:22 PM
Ok, thanks. I still don't understand what the spec says...


Also, the buffer object binding (GL_ARRAY_BUFFER_BINDING) is saved as generic vertex attribute array client-side state (GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING) for index index.

I know that the state of a bound buffer object is saved whenever I do any changes/updates to the specific target it is bound to (for example GL_ARRAY_BUFFER). But maybe that qoute has nothing to do with this...

Dan Bartlett
12-08-2011, 01:57 PM
It means that when you call glVertexAttribPointer, as well as storing "size", "type", "normalized", "stride" and "pointer" for attribute "index", the current value of GL_ARRAY_BUFFER is also grabbed + stored with it.

PeTeAR
12-08-2011, 02:26 PM
Ahhhhh....

Thanks, I *see* it now :-)

The vertex buffer object binding that is active when glVertexAttribPointer is called, is saved (somewhere in some vertexattrib internal secret memory?) as well as the parameters to it. Then when glDrawElements is called, it checks for enabled vertexattribarrays and uses the "saved" information to incorporate the buffer contents with each index.

Thanks all!
/P