I’m trying to learn OpenGL 2.0 because I need to do some work w/ an OpenGL ES implementation for Android that utilizes 2.0. So I’ve set up a build environment for Windows 7 (64) and am running through some basic tutorials.
Using the Lighthouse 3D Simple Demo for GLSL 2.0, I’ve modified this code to utilize glDrawArrays and am simply drawing a cross in the middle of the screen.
What I’m a little confused about concerning the use of Vertex Arrays and Vertex Attribute Arrays is how and where to initialize and enable these, and clean them up when done. Also I’d like to understand how to best structure and organize the set-up and updating of the rendering context.
Any advice on the following code will be appreciated. This builds and runs as expected - rendering a cross. I’ve left out the functions that aren’t relevant, so if you see one that isn’t defined, that’s why.
#define WIN32
#define LOG(...) printf( __VA_ARGS__ )
#include <stdio.h>
#include <stdlib.h>
#include <GL/Glee.h>
#include <GL/glut.h>
#include "textfile.h"
// light position
float lpos[4] = {1,1,1,0};
GLfloat crossVertices[] = { -1.0f,0.0f,0.0f,
1.0f,0.0f,0.0f,
0.0f,1.0f,0.0f,
0.0f,-1.0f,0.0f
};
// vertex array object
unsigned int vertexArrayObjID[1];
// vertex buffer object
unsigned int vertexBufferObjID[1];
int main(int argc, char **argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowPosition(100,100);
glutInitWindowSize(320,320);
glutCreateWindow("MM 2004-05");
glutDisplayFunc(renderScene);
glutIdleFunc(renderScene);
glutReshapeFunc(changeSize);
glutKeyboardFunc(processNormalKeys);
glEnable(GL_DEPTH_TEST);
glClearColor(1.0,1.0,1.0,1.0);
glEnable(GL_CULL_FACE);
setShaders();
initVertices();
glutMainLoop();
// just for compatibiliy purposes
return 0;
}
void initVertices(){
// is glEnableClientState not required any longer?
//glEnableClientState(GL_VERTEX_ARRAY);
// Allocate Vertex Array Object
glGenVertexArrays(1, &vertexArrayObjID[0]);
// Setup Vertex Array Object
glBindVertexArray(vertexArrayObjID[0]);
glGenBuffers(1, vertexBufferObjID);
glBindBuffer(GL_ARRAY_BUFFER, vertexBufferObjID[0]);
glBufferData(GL_ARRAY_BUFFER, 12*sizeof(GLfloat), crossVertices, GL_STATIC_DRAW);
glVertexAttribPointer((GLuint)0, 3, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(0);
glBindVertexArray(0);
//glDisableVertexAttribArray(0);
}
void renderScene(void) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLightfv(GL_LIGHT0, GL_POSITION, lpos);
//glutSolidTeapot(1); ~ from the original code
glBindVertexArray(vertexArrayObjID[0]);
glLineWidth(2.0f);
//checkGlError("Draw Arrays");
glDrawArrays(GL_LINES, 0, 4);
glBindVertexArray(0);
glutSwapBuffers();
}
void changeSize(int w, int h) {
// Prevent a divide by zero, when window is too short
// (you cant make a window of zero width).
if(h == 0)
h = 1;
float ratio = 1.0* w / h;
// Reset the coordinate system before modifying
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
// Set the viewport to be the entire window
glViewport(0, 0, w, h);
// Set the correct perspective.
gluPerspective(45,ratio,1,10);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0.0,0.0,7.0,
0.0,0.0,0.0,
0.0f,1.0f,0.0f);
}