Chromium Code Reviews| Index: third_party/gles2_book/Chapter_8/Simple_VertexShader/Simple_VertexShader.c |
| =================================================================== |
| --- third_party/gles2_book/Chapter_8/Simple_VertexShader/Simple_VertexShader.c (revision 36016) |
| +++ third_party/gles2_book/Chapter_8/Simple_VertexShader/Simple_VertexShader.c (working copy) |
| @@ -23,6 +23,10 @@ |
| int svsInit ( ESContext *esContext ) |
| { |
| SVSUserData *userData = esContext->userData; |
| + int numVertices = 24; |
| + GLfloat *vertices = NULL; |
| + GLushort *indices = NULL; |
| + |
| GLbyte vShaderStr[] = |
| "uniform mat4 u_mvpMatrix; \n" |
| "attribute vec4 a_position; \n" |
| @@ -41,6 +45,7 @@ |
| // Load the shaders and get a linked program object |
| userData->programObject = esLoadProgram ( vShaderStr, fShaderStr ); |
| + if ( userData->programObject == 0 ) return FALSE; |
| // Get the attribute locations |
| userData->positionLoc = glGetAttribLocation ( userData->programObject, "a_position" ); |
| @@ -49,9 +54,17 @@ |
| userData->mvpLoc = glGetUniformLocation( userData->programObject, "u_mvpMatrix" ); |
| // Generate the vertex data |
| - userData->numIndices = esGenCube( 1.0, &userData->vertices, |
| - NULL, NULL, &userData->indices ); |
| - |
| + userData->numIndices = esGenCube( 1.0, &vertices, NULL, NULL, &indices ); |
| + glGenBuffers ( 2, userData->vboIds ); |
| + glBindBuffer ( GL_ARRAY_BUFFER, userData->vboIds[0] ); |
| + glBufferData ( GL_ARRAY_BUFFER, 3 * numVertices * sizeof(GLfloat), |
| + vertices, GL_STATIC_DRAW ); |
| + glBindBuffer ( GL_ELEMENT_ARRAY_BUFFER, userData->vboIds[1] ); |
| + glBufferData ( GL_ELEMENT_ARRAY_BUFFER, userData->numIndices * sizeof(GL_UNSIGNED_SHORT), |
| + indices, GL_STATIC_DRAW ); |
| + if ( vertices != NULL ) free ( vertices ); |
| + if ( indices != NULL ) free ( indices ); |
| + |
| // Starting rotation angle for the cube |
| userData->angle = 45.0f; |
| @@ -105,7 +118,6 @@ |
| // Set the viewport |
| glViewport ( 0, 0, esContext->width, esContext->height ); |
| - |
| // Clear the color buffer |
| glClear ( GL_COLOR_BUFFER_BIT ); |
| @@ -113,17 +125,15 @@ |
| glUseProgram ( userData->programObject ); |
| // Load the vertex position |
| + glEnableVertexAttribArray ( userData->positionLoc ); |
|
greggman
2010/01/13 03:10:43
Any particular reason you switched the order of th
alokp
2010/01/13 03:52:59
no particular reason. does it matter?
|
| glVertexAttribPointer ( userData->positionLoc, 3, GL_FLOAT, |
| - GL_FALSE, 3 * sizeof(GLfloat), userData->vertices ); |
| - |
| - glEnableVertexAttribArray ( userData->positionLoc ); |
| - |
| - |
| + GL_FALSE, 3 * sizeof(GLfloat), 0 ); |
| + |
| // Load the MVP matrix |
| glUniformMatrix4fv( userData->mvpLoc, 1, GL_FALSE, (GLfloat*) &userData->mvpMatrix.m[0][0] ); |
| // Draw the cube |
| - glDrawElements ( GL_TRIANGLES, userData->numIndices, GL_UNSIGNED_INT, userData->indices ); |
| + glDrawElements ( GL_TRIANGLES, userData->numIndices, GL_UNSIGNED_SHORT, 0 ); |
| // TODO(alokp): glFlush should not be necessary with SwapBuffers. |
| glFlush(); |
| @@ -136,16 +146,9 @@ |
| { |
| SVSUserData *userData = esContext->userData; |
| - if ( userData->vertices != NULL ) |
| - { |
| - free ( userData->vertices ); |
| - } |
| + // Delete program object |
| + glDeleteBuffers ( 2, userData->vboIds ); |
| - if ( userData->indices != NULL ) |
| - { |
| - free ( userData->indices ); |
| - } |
| - |
| // Delete program object |
| glDeleteProgram ( userData->programObject ); |
| } |