I just wanted to share what it took to draw a simple yellow triangle on a black background in OpenGL|ES. I hope it will give my Ruby friends and Haskell friends an aneurysm.
To show this:

I had to do this:
//The headers
#include <SDL/SDL.h>
#include <SDL/SDL_opengles.h>
//Screen attributes
const int SCREEN_WIDTH = 480;
const int SCREEN_HEIGHT = 320;
const int SCREEN_BPP = 32;
SDL_Event event;
GLuint programObject;
GLuint LoadShader ( GLenum type, const char *shaderSrc )
{
GLuint shader;
GLint compiled;
// Create the shader object
shader = glCreateShader ( type );
if ( shader == 0 )
return 0;
// Load the shader source
glShaderSource ( shader, 1, &amp;amp;amp;amp;shaderSrc, NULL );
// Compile the shader
glCompileShader ( shader );
// Check the compile status
glGetShaderiv ( shader, GL_COMPILE_STATUS, &amp;amp;amp;amp;compiled );
return shader;
}
bool init_GL() {
const char* vShaderStr = "attribute vec4 vPosition; \n"
"void main() \n"
"{ \n"
" gl_Position = vPosition; \n"
"} \n";
const char* fShaderStr = "precision mediump float;\n"
"void main() \n"
"{ \n"
" gl_FragColor = vec4 ( 1.0, 1.0, 0.0, 1.0 );\n"
"} \n";
GLuint vertexShader;
GLuint fragmentShader;
GLint linked;
// Load the vertex/fragment shaders
vertexShader = LoadShader(GL_VERTEX_SHADER, vShaderStr);
fragmentShader = LoadShader(GL_FRAGMENT_SHADER, fShaderStr);
// Create the program object
programObject = glCreateProgram();
if (programObject == 0)
return 0;
glAttachShader(programObject, vertexShader);
glAttachShader(programObject, fragmentShader);
// Bind vPosition to attribute 0
glBindAttribLocation(programObject, 0, "vPosition");
// Link the program
glLinkProgram(programObject);
// Check the link status
glGetProgramiv(programObject, GL_LINK_STATUS, &amp;amp;amp;amp;linked);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
return true;
}
bool init() {
//Initialize SDL
if (SDL_Init(SDL_INIT_EVERYTHING) < 0) {
// return false;
}
//Create Window
if (SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_OPENGL)
== NULL) {
return false;
}
//Initialize OpenGL
if (init_GL() == false) {
return false;
}
//Set caption
SDL_WM_SetCaption("OpenGL Test", NULL);
return true;
}
void clean_up() {
//Quit SDL
SDL_Quit();
}
void Draw() {
GLfloat vVertices[] = { 0.0f, 0.5f, 0.0f, -0.5f, -0.5f, 0.0f, 0.5f, -0.5f,
0.0f };
// Set the viewport
glViewport(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
// Clear the color buffer
glClear(GL_COLOR_BUFFER_BIT);
// Use the program object
glUseProgram(programObject);
// Load the vertex data
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, vVertices);
glEnableVertexAttribArray(0);
glDrawArrays(GL_TRIANGLES, 0, 3);
}
int main(int argc, char *argv[]) {
//Quit flag
bool quit = false;
//Initialize
if (init() == false) {
return 1;
}
//Wait for user exit
while (quit == false) {
//While there are events to handle
while (SDL_PollEvent(&amp;amp;amp;amp;event)) {
//Handle key presses
if (event.type == SDL_QUIT) {
quit = true;
}
}
Draw();
SDL_GL_SwapBuffers();
}
//Clean up
clean_up();
return 0;
}
You will all be happy to know that one of the first things I did (after re-learning make) was dive into google test and get a testing framework working. My last several projects have been with Ruby and Java, and in my spare time I have been building Palm Pre apps in Javascript and messing around with Erlang.
So I thought it was funny that many of my friends have been going to more and more abstract languages, while I, oddly, have decided to go lower. I have been playing around with doing OpenGL|ES and C++ lately in my spare time, hopefully in prep of the release of the Native SDK (PDK) for the Palm Pre.
One Comment
Gaffo, some of your line numbers are indenting into and on top of the code. It makes it really hard to read. We’ll have to sit and talk C sometime. It has been a while, not withstanding the git patch. I really like playing in C.
Post a Comment