| OLD | NEW |
| 1 // | 1 // |
| 2 // Book: OpenGL(R) ES 2.0 Programming Guide | 2 // Book: OpenGL(R) ES 2.0 Programming Guide |
| 3 // Authors: Aaftab Munshi, Dan Ginsburg, Dave Shreiner | 3 // Authors: Aaftab Munshi, Dan Ginsburg, Dave Shreiner |
| 4 // ISBN-10: 0321502795 | 4 // ISBN-10: 0321502795 |
| 5 // ISBN-13: 9780321502797 | 5 // ISBN-13: 9780321502797 |
| 6 // Publisher: Addison-Wesley Professional | 6 // Publisher: Addison-Wesley Professional |
| 7 // URLs: http://safari.informit.com/9780321563835 | 7 // URLs: http://safari.informit.com/9780321563835 |
| 8 // http://www.opengles-book.com | 8 // http://www.opengles-book.com |
| 9 // | 9 // |
| 10 | 10 |
| 11 // Simple_VertexShader.c | 11 // Simple_VertexShader.c |
| 12 // | 12 // |
| 13 // This is a simple example that draws a rotating cube in perspective | 13 // This is a simple example that draws a rotating cube in perspective |
| 14 // using a vertex shader to transform the object | 14 // using a vertex shader to transform the object |
| 15 // | 15 // |
| 16 |
| 17 #include "Simple_VertexShader.h" |
| 16 #include <stdlib.h> | 18 #include <stdlib.h> |
| 17 #include "esUtil.h" | |
| 18 | |
| 19 typedef struct | |
| 20 { | |
| 21 // Handle to a program object | |
| 22 GLuint programObject; | |
| 23 | |
| 24 // Attribute locations | |
| 25 GLint positionLoc; | |
| 26 | |
| 27 // Uniform locations | |
| 28 GLint mvpLoc; | |
| 29 | |
| 30 // Vertex daata | |
| 31 GLfloat *vertices; | |
| 32 GLuint *indices; | |
| 33 int numIndices; | |
| 34 | |
| 35 // Rotation angle | |
| 36 GLfloat angle; | |
| 37 | |
| 38 // MVP matrix | |
| 39 ESMatrix mvpMatrix; | |
| 40 } UserData; | |
| 41 | 19 |
| 42 /// | 20 /// |
| 43 // Initialize the shader and program object | 21 // Initialize the shader and program object |
| 44 // | 22 // |
| 45 int Init ( ESContext *esContext ) | 23 int svsInit ( ESContext *esContext ) |
| 46 { | 24 { |
| 47 UserData *userData = esContext->userData; | 25 SVSUserData *userData = esContext->userData; |
| 48 GLbyte vShaderStr[] = | 26 GLbyte vShaderStr[] = |
| 49 "uniform mat4 u_mvpMatrix; \n" | 27 "uniform mat4 u_mvpMatrix; \n" |
| 50 "attribute vec4 a_position; \n" | 28 "attribute vec4 a_position; \n" |
| 51 "void main() \n" | 29 "void main() \n" |
| 52 "{ \n" | 30 "{ \n" |
| 53 " gl_Position = u_mvpMatrix * a_position; \n" | 31 " gl_Position = u_mvpMatrix * a_position; \n" |
| 54 "} \n"; | 32 "} \n"; |
| 55 | 33 |
| 34 // TODO(alokp): Shaders containing "precision" do not compile. |
| 56 GLbyte fShaderStr[] = | 35 GLbyte fShaderStr[] = |
| 57 "precision mediump float; \n" | 36 "//precision mediump float; \n" |
| 58 "void main() \n" | 37 "void main() \n" |
| 59 "{ \n" | 38 "{ \n" |
| 60 " gl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 ); \n" | 39 " gl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 ); \n" |
| 61 "} \n"; | 40 "} \n"; |
| 62 | 41 |
| 63 // Load the shaders and get a linked program object | 42 // Load the shaders and get a linked program object |
| 64 userData->programObject = esLoadProgram ( vShaderStr, fShaderStr ); | 43 userData->programObject = esLoadProgram ( vShaderStr, fShaderStr ); |
| 65 | 44 |
| 66 // Get the attribute locations | 45 // Get the attribute locations |
| 67 userData->positionLoc = glGetAttribLocation ( userData->programObject, "a_pos
ition" ); | 46 userData->positionLoc = glGetAttribLocation ( userData->programObject, "a_pos
ition" ); |
| 68 | 47 |
| 69 // Get the uniform locations | 48 // Get the uniform locations |
| 70 userData->mvpLoc = glGetUniformLocation( userData->programObject, "u_mvpMatri
x" ); | 49 userData->mvpLoc = glGetUniformLocation( userData->programObject, "u_mvpMatri
x" ); |
| 71 | 50 |
| 72 // Generate the vertex data | 51 // Generate the vertex data |
| 73 userData->numIndices = esGenCube( 1.0, &userData->vertices, | 52 userData->numIndices = esGenCube( 1.0, &userData->vertices, |
| 74 NULL, NULL, &userData->indices ); | 53 NULL, NULL, &userData->indices ); |
| 75 | 54 |
| 76 // Starting rotation angle for the cube | 55 // Starting rotation angle for the cube |
| 77 userData->angle = 45.0f; | 56 userData->angle = 45.0f; |
| 78 | 57 |
| 79 glClearColor ( 0.0f, 0.0f, 0.0f, 0.0f ); | 58 glClearColor ( 0.0f, 0.0f, 0.0f, 0.0f ); |
| 80 return TRUE; | 59 return TRUE; |
| 81 } | 60 } |
| 82 | 61 |
| 83 | |
| 84 /// | 62 /// |
| 85 // Update MVP matrix based on time | 63 // Update MVP matrix based on time |
| 86 // | 64 // |
| 87 void Update ( ESContext *esContext, float deltaTime ) | 65 void svsUpdate ( ESContext *esContext, float deltaTime ) |
| 88 { | 66 { |
| 89 UserData *userData = (UserData*) esContext->userData; | 67 SVSUserData *userData = (SVSUserData*) esContext->userData; |
| 90 ESMatrix perspective; | 68 ESMatrix perspective; |
| 91 ESMatrix modelview; | 69 ESMatrix modelview; |
| 92 float aspect; | 70 float aspect; |
| 93 | 71 |
| 94 // Compute a rotation angle based on time to rotate the cube | 72 // Compute a rotation angle based on time to rotate the cube |
| 95 userData->angle += ( deltaTime * 40.0f ); | 73 userData->angle += ( deltaTime * 40.0f ); |
| 96 if( userData->angle >= 360.0f ) | 74 if( userData->angle >= 360.0f ) |
| 97 userData->angle -= 360.0f; | 75 userData->angle -= 360.0f; |
| 98 | 76 |
| 99 // Compute the window aspect ratio | 77 // Compute the window aspect ratio |
| (...skipping 13 matching lines...) Expand all Loading... |
| 113 esRotate( &modelview, userData->angle, 1.0, 0.0, 1.0 ); | 91 esRotate( &modelview, userData->angle, 1.0, 0.0, 1.0 ); |
| 114 | 92 |
| 115 // Compute the final MVP by multiplying the | 93 // Compute the final MVP by multiplying the |
| 116 // modevleiw and perspective matrices together | 94 // modevleiw and perspective matrices together |
| 117 esMatrixMultiply( &userData->mvpMatrix, &modelview, &perspective ); | 95 esMatrixMultiply( &userData->mvpMatrix, &modelview, &perspective ); |
| 118 } | 96 } |
| 119 | 97 |
| 120 /// | 98 /// |
| 121 // Draw a triangle using the shader pair created in Init() | 99 // Draw a triangle using the shader pair created in Init() |
| 122 // | 100 // |
| 123 void Draw ( ESContext *esContext ) | 101 void svsDraw ( ESContext *esContext ) |
| 124 { | 102 { |
| 125 UserData *userData = esContext->userData; | 103 SVSUserData *userData = esContext->userData; |
| 126 | 104 |
| 127 // Set the viewport | 105 // Set the viewport |
| 128 glViewport ( 0, 0, esContext->width, esContext->height ); | 106 glViewport ( 0, 0, esContext->width, esContext->height ); |
| 129 | 107 |
| 130 | 108 |
| 131 // Clear the color buffer | 109 // Clear the color buffer |
| 132 glClear ( GL_COLOR_BUFFER_BIT ); | 110 glClear ( GL_COLOR_BUFFER_BIT ); |
| 133 | 111 |
| 134 // Use the program object | 112 // Use the program object |
| 135 glUseProgram ( userData->programObject ); | 113 glUseProgram ( userData->programObject ); |
| 136 | 114 |
| 137 // Load the vertex position | 115 // Load the vertex position |
| 138 glVertexAttribPointer ( userData->positionLoc, 3, GL_FLOAT, | 116 glVertexAttribPointer ( userData->positionLoc, 3, GL_FLOAT, |
| 139 GL_FALSE, 3 * sizeof(GLfloat), userData->vertices ); | 117 GL_FALSE, 3 * sizeof(GLfloat), userData->vertices ); |
| 140 | 118 |
| 141 glEnableVertexAttribArray ( userData->positionLoc ); | 119 glEnableVertexAttribArray ( userData->positionLoc ); |
| 142 | 120 |
| 143 | 121 |
| 144 // Load the MVP matrix | 122 // Load the MVP matrix |
| 145 glUniformMatrix4fv( userData->mvpLoc, 1, GL_FALSE, (GLfloat*) &userData->mvpM
atrix.m[0][0] ); | 123 glUniformMatrix4fv( userData->mvpLoc, 1, GL_FALSE, (GLfloat*) &userData->mvpM
atrix.m[0][0] ); |
| 146 | 124 |
| 147 // Draw the cube | 125 // Draw the cube |
| 148 glDrawElements ( GL_TRIANGLES, userData->numIndices, GL_UNSIGNED_INT, userDat
a->indices ); | 126 glDrawElements ( GL_TRIANGLES, userData->numIndices, GL_UNSIGNED_INT, userDat
a->indices ); |
| 149 | 127 |
| 150 eglSwapBuffers ( esContext->eglDisplay, esContext->eglSurface ); | 128 // TODO(alokp): glFlush should not be necessary with SwapBuffers. |
| 129 glFlush(); |
| 151 } | 130 } |
| 152 | 131 |
| 153 /// | 132 /// |
| 154 // Cleanup | 133 // Cleanup |
| 155 // | 134 // |
| 156 void ShutDown ( ESContext *esContext ) | 135 void svsShutDown ( ESContext *esContext ) |
| 157 { | 136 { |
| 158 UserData *userData = esContext->userData; | 137 SVSUserData *userData = esContext->userData; |
| 159 | 138 |
| 160 if ( userData->vertices != NULL ) | 139 if ( userData->vertices != NULL ) |
| 161 { | 140 { |
| 162 free ( userData->vertices ); | 141 free ( userData->vertices ); |
| 163 } | 142 } |
| 164 | 143 |
| 165 if ( userData->indices != NULL ) | 144 if ( userData->indices != NULL ) |
| 166 { | 145 { |
| 167 free ( userData->indices ); | 146 free ( userData->indices ); |
| 168 } | 147 } |
| 169 | 148 |
| 170 // Delete program object | 149 // Delete program object |
| 171 glDeleteProgram ( userData->programObject ); | 150 glDeleteProgram ( userData->programObject ); |
| 172 } | 151 } |
| 173 | |
| 174 | |
| 175 int main ( int argc, char *argv[] ) | |
| 176 { | |
| 177 ESContext esContext; | |
| 178 UserData userData; | |
| 179 | |
| 180 esInitContext ( &esContext ); | |
| 181 esContext.userData = &userData; | |
| 182 | |
| 183 esCreateWindow ( &esContext, "Simple Texture 2D", 320, 240, ES_WINDOW_RGB ); | |
| 184 | |
| 185 if ( !Init ( &esContext ) ) | |
| 186 return 0; | |
| 187 | |
| 188 esRegisterDrawFunc ( &esContext, Draw ); | |
| 189 esRegisterUpdateFunc ( &esContext, Update ); | |
| 190 | |
| 191 esMainLoop ( &esContext ); | |
| 192 | |
| 193 ShutDown ( &esContext ); | |
| 194 } | |
| OLD | NEW |