summaryrefslogtreecommitdiffstats
path: root/third_party/gles2_book
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
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')
-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
-rw-r--r--third_party/gles2_book/Common/Include/esUtil.h4
-rw-r--r--third_party/gles2_book/Common/Source/esShapes.c12
4 files changed, 33 insertions, 31 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;
diff --git a/third_party/gles2_book/Common/Include/esUtil.h b/third_party/gles2_book/Common/Include/esUtil.h
index a1a72c4..9897e1b 100644
--- a/third_party/gles2_book/Common/Include/esUtil.h
+++ b/third_party/gles2_book/Common/Include/esUtil.h
@@ -95,7 +95,7 @@ extern GLuint esLoadProgram ( const char *vertShaderSrc, const char *fragShaderS
/// if it is not NULL ) as a GL_TRIANGLE_STRIP
//
extern int esGenSphere ( int numSlices, float radius, GLfloat **vertices, GLfloat **normals,
- GLfloat **texCoords, GLuint **indices );
+ GLfloat **texCoords, GLushort **indices );
//
/// \brief Generates geometry for a cube. Allocates memory for the vertex data and stores
@@ -109,7 +109,7 @@ extern int esGenSphere ( int numSlices, float radius, GLfloat **vertices, GLfloa
/// if it is not NULL ) as a GL_TRIANGLES
//
extern int esGenCube ( float scale, GLfloat **vertices, GLfloat **normals,
- GLfloat **texCoords, GLuint **indices );
+ GLfloat **texCoords, GLushort **indices );
//
/// \brief Loads a 24-bit TGA image from a file
diff --git a/third_party/gles2_book/Common/Source/esShapes.c b/third_party/gles2_book/Common/Source/esShapes.c
index ddb75c7..dee7efb 100644
--- a/third_party/gles2_book/Common/Source/esShapes.c
+++ b/third_party/gles2_book/Common/Source/esShapes.c
@@ -52,7 +52,7 @@
/// if it is not NULL ) as a GL_TRIANGLE_STRIP
//
int esGenSphere ( int numSlices, float radius, GLfloat **vertices, GLfloat **normals,
- GLfloat **texCoords, GLuint **indices )
+ GLfloat **texCoords, GLushort **indices )
{
int i;
int j;
@@ -72,7 +72,7 @@ int esGenSphere ( int numSlices, float radius, GLfloat **vertices, GLfloat **nor
*texCoords = malloc ( sizeof(GLfloat) * 2 * numVertices );
if ( indices != NULL )
- *indices = malloc ( sizeof(GLuint) * numIndices );
+ *indices = malloc ( sizeof(GLushort) * numIndices );
for ( i = 0; i < numParallels + 1; i++ )
{
@@ -108,7 +108,7 @@ int esGenSphere ( int numSlices, float radius, GLfloat **vertices, GLfloat **nor
// Generate the indices
if ( indices != NULL )
{
- GLuint *indexBuf = (*indices);
+ GLushort *indexBuf = (*indices);
for ( i = 0; i < numParallels ; i++ )
{
for ( j = 0; j < numSlices; j++ )
@@ -139,7 +139,7 @@ int esGenSphere ( int numSlices, float radius, GLfloat **vertices, GLfloat **nor
/// if it is not NULL ) as a GL_TRIANGLE_STRIP
//
int esGenCube ( float scale, GLfloat **vertices, GLfloat **normals,
- GLfloat **texCoords, GLuint **indices )
+ GLfloat **texCoords, GLushort **indices )
{
int i;
int numVertices = 24;
@@ -256,7 +256,7 @@ int esGenCube ( float scale, GLfloat **vertices, GLfloat **normals,
// Generate the indices
if ( indices != NULL )
{
- GLuint cubeIndices[] =
+ GLushort cubeIndices[] =
{
0, 2, 1,
0, 3, 2,
@@ -272,7 +272,7 @@ int esGenCube ( float scale, GLfloat **vertices, GLfloat **normals,
20, 22, 21
};
- *indices = malloc ( sizeof(GLuint) * numIndices );
+ *indices = malloc ( sizeof(GLushort) * numIndices );
memcpy( *indices, cubeIndices, sizeof( cubeIndices ) );
}