summaryrefslogtreecommitdiffstats
path: root/third_party/gles2_book/Chapter_8
diff options
context:
space:
mode:
authoralokp@chromium.org <alokp@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-01-13 17:20:44 +0000
committeralokp@chromium.org <alokp@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-01-13 17:20:44 +0000
commitbd0dae9836979fb4d33574e34ecde51b911e87c6 (patch)
tree24a6d98dd5e1b98265224d64650057ed9491282d /third_party/gles2_book/Chapter_8
parent8e65f11ba2e6ba7ebbc81e23aef288969b0f5ebd (diff)
downloadchromium_src-bd0dae9836979fb4d33574e34ecde51b911e87c6.zip
chromium_src-bd0dae9836979fb4d33574e34ecde51b911e87c6.tar.gz
chromium_src-bd0dae9836979fb4d33574e34ecde51b911e87c6.tar.bz2
Added simple vertex shader demo. I had to make the following modifications to third-party code:
- Changed client-side vertex array to VBO - Used GL_UNSIGNED_SHORT instead of GL_UNSIGNED_INT in glDrawElements because GL_UNSIGNED_INT is not supported for by OpenGL ES 2.0 for indices BUG=26099 TEST=Run simple_vertex_shader executable, you should see a rotating cube. Review URL: http://codereview.chromium.org/543015 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@36127 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'third_party/gles2_book/Chapter_8')
-rw-r--r--third_party/gles2_book/Chapter_8/Simple_VertexShader/Simple_VertexShader.c41
-rw-r--r--third_party/gles2_book/Chapter_8/Simple_VertexShader/Simple_VertexShader.h7
2 files changed, 25 insertions, 23 deletions
diff --git a/third_party/gles2_book/Chapter_8/Simple_VertexShader/Simple_VertexShader.c b/third_party/gles2_book/Chapter_8/Simple_VertexShader/Simple_VertexShader.c
index ad6f188..8b9c217 100644
--- a/third_party/gles2_book/Chapter_8/Simple_VertexShader/Simple_VertexShader.c
+++ b/third_party/gles2_book/Chapter_8/Simple_VertexShader/Simple_VertexShader.c
@@ -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 @@ int svsInit ( ESContext *esContext )
// 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 @@ int svsInit ( ESContext *esContext )
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 @@ void svsDraw ( ESContext *esContext )
// Set the viewport
glViewport ( 0, 0, esContext->width, esContext->height );
-
// Clear the color buffer
glClear ( GL_COLOR_BUFFER_BIT );
@@ -113,17 +125,15 @@ void svsDraw ( ESContext *esContext )
glUseProgram ( userData->programObject );
// Load the vertex position
- glVertexAttribPointer ( userData->positionLoc, 3, GL_FLOAT,
- GL_FALSE, 3 * sizeof(GLfloat), userData->vertices );
-
glEnableVertexAttribArray ( userData->positionLoc );
-
-
+ glVertexAttribPointer ( userData->positionLoc, 3, GL_FLOAT,
+ 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,15 +146,8 @@ void svsShutDown ( ESContext *esContext )
{
SVSUserData *userData = esContext->userData;
- if ( userData->vertices != NULL )
- {
- free ( userData->vertices );
- }
-
- if ( userData->indices != NULL )
- {
- free ( userData->indices );
- }
+ // Delete program object
+ glDeleteBuffers ( 2, userData->vboIds );
// Delete program object
glDeleteProgram ( userData->programObject );
diff --git a/third_party/gles2_book/Chapter_8/Simple_VertexShader/Simple_VertexShader.h b/third_party/gles2_book/Chapter_8/Simple_VertexShader/Simple_VertexShader.h
index e3c8832..b581185 100644
--- a/third_party/gles2_book/Chapter_8/Simple_VertexShader/Simple_VertexShader.h
+++ b/third_party/gles2_book/Chapter_8/Simple_VertexShader/Simple_VertexShader.h
@@ -28,10 +28,9 @@ typedef struct
// Uniform locations
GLint mvpLoc;
- // Vertex daata
- GLfloat *vertices;
- GLuint *indices;
- int numIndices;
+ // Vertex data
+ int numIndices;
+ GLuint vboIds[2];
// Rotation angle
GLfloat angle;