| OLD | NEW |
| (Empty) |
| 1 // | |
| 2 // Book: OpenGL(R) ES 2.0 Programming Guide | |
| 3 // Authors: Aaftab Munshi, Dan Ginsburg, Dave Shreiner | |
| 4 // ISBN-10: 0321502795 | |
| 5 // ISBN-13: 9780321502797 | |
| 6 // Publisher: Addison-Wesley Professional | |
| 7 // URLs: http://safari.informit.com/9780321563835 | |
| 8 // http://www.opengles-book.com | |
| 9 // | |
| 10 | |
| 11 // Hello_Triangle.c | |
| 12 // | |
| 13 // This is a simple example that draws a single triangle with | |
| 14 // a minimal vertex/fragment shader. The purpose of this | |
| 15 // example is to demonstrate the basic concepts of | |
| 16 // OpenGL ES 2.0 rendering. | |
| 17 | |
| 18 #include "Hello_Triangle.h" | |
| 19 | |
| 20 #include <stdlib.h> | |
| 21 | |
| 22 /// | |
| 23 // Initialize the shader and program object | |
| 24 // | |
| 25 int htInit ( ESContext *esContext ) | |
| 26 { | |
| 27 HTUserData *userData = esContext->userData; | |
| 28 | |
| 29 GLbyte vShaderStr[] = | |
| 30 "attribute vec4 vPosition; \n" | |
| 31 "void main() \n" | |
| 32 "{ \n" | |
| 33 " gl_Position = vPosition; \n" | |
| 34 "} \n"; | |
| 35 | |
| 36 // TODO(alokp): Shaders containing "precision" do not compile. | |
| 37 GLbyte fShaderStr[] = | |
| 38 "//precision mediump float; \n" | |
| 39 "void main() \n" | |
| 40 "{ \n" | |
| 41 " gl_FragColor = vec4 ( 1.0, 0.0, 0.0, 1.0 );\n" | |
| 42 "} \n"; | |
| 43 | |
| 44 GLfloat vVertices[] = { 0.0f, 0.5f, 0.0f, | |
| 45 -0.5f, -0.5f, 0.0f, | |
| 46 0.5f, -0.5f, 0.0f }; | |
| 47 | |
| 48 userData->programObject = esLoadProgram ( vShaderStr, fShaderStr ); | |
| 49 if ( userData->programObject == 0 ) return FALSE; | |
| 50 | |
| 51 // Bind vPosition to attribute 0 | |
| 52 glBindAttribLocation ( userData->programObject, 0, "vPosition" ); | |
| 53 | |
| 54 glGenBuffers ( 1, &userData->vbo ); | |
| 55 glBindBuffer ( GL_ARRAY_BUFFER, userData->vbo ); | |
| 56 glBufferData ( GL_ARRAY_BUFFER, sizeof(vVertices), NULL, GL_STATIC_DRAW ); | |
| 57 glBufferSubData ( GL_ARRAY_BUFFER, 0, sizeof(vVertices), vVertices ); | |
| 58 | |
| 59 glClearColor ( 0.0f, 0.0f, 0.0f, 0.0f ); | |
| 60 return TRUE; | |
| 61 } | |
| 62 | |
| 63 /// | |
| 64 // Draw a triangle using the shader pair created in Init() | |
| 65 // | |
| 66 void htDraw ( ESContext *esContext ) | |
| 67 { | |
| 68 HTUserData *userData = esContext->userData; | |
| 69 | |
| 70 // Set the viewport | |
| 71 glViewport ( 0, 0, esContext->width, esContext->height ); | |
| 72 | |
| 73 // Clear the color buffer | |
| 74 glClear ( GL_COLOR_BUFFER_BIT ); | |
| 75 | |
| 76 // Use the program object | |
| 77 glUseProgram ( userData->programObject ); | |
| 78 | |
| 79 // Load the vertex data | |
| 80 glBindBuffer ( GL_ARRAY_BUFFER, userData->vbo ); | |
| 81 glEnableVertexAttribArray ( 0 ); | |
| 82 glVertexAttribPointer ( 0, 3, GL_FLOAT, GL_FALSE, 0, 0 ); | |
| 83 | |
| 84 glDrawArrays ( GL_TRIANGLES, 0, 3 ); | |
| 85 | |
| 86 // Nothing is drawn or application crashes without glFlush. | |
| 87 // TODO(alokp): glFlush should not be necessary with SwapBuffers(). | |
| 88 glFlush(); | |
| 89 } | |
| 90 | |
| 91 /// | |
| 92 // Cleanup | |
| 93 // | |
| 94 void htShutDown ( ESContext *esContext ) | |
| 95 { | |
| 96 HTUserData *userData = esContext->userData; | |
| 97 | |
| 98 // Delete program object | |
| 99 if ( userData->programObject != 0 ) | |
| 100 { | |
| 101 glDeleteProgram ( userData->programObject ); | |
| 102 userData->programObject = 0; | |
| 103 } | |
| 104 if ( userData->vbo != 0 ) | |
| 105 { | |
| 106 glDeleteBuffers ( 1, &userData->vbo ); | |
| 107 userData->vbo = 0; | |
| 108 } | |
| 109 } | |
| OLD | NEW |