I’m trying to get started with OpenGL on OS X and I haven’t been able to get this simple program to work. It’s supposed to draw a triangle, but it isn’t. I took some of it from NeHe’s tutorial. I’d really appreciate if someone could tell me why it’s not working! Here’s the code:
#include <stdio.h>
#include <OpenGL/gl.h>
#include <OpenGL/glu.h>
#include <GLUT/glut.h>
// Window width and height
#define width 800
#define height 600
// Window position
#define winXPos 720
#define winYPos 450
void draw(void) {
glEnable(GL_DEPTH_TEST);
// Clear screen and depth buffer
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// Reset the view
glLoadIdentity();
// Make the view deeper so we can see the scene
glTranslatef(0.0f, 0.0f, 9.0f);
// Draw a rectangle
glNewList(1, GL_COMPILE_AND_EXECUTE);
glColor3f(1.0, 0.0, 0.0);
glBegin(GL_TRIANGLES);
glVertex3f(0.0f, 1000.0f, 0.0f);
glVertex3f(-1000.0f, -1000.0f, 0.0f);
glVertex3f(1000.0f, -1000.0f, 0.0f);
glEnd();
glEndList();
glFlush();
}
void initGL() {
glShadeModel(GL_SMOOTH);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClearDepth(1.0f);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
}
int main (int argc, char *argv[]) {
// Initialize opengl
glutInit(&argc, argv);
// Set parameters: double buffer for smooth animation and RGB colors
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE | GLUT_DEPTH);
// Set window size
glutInitWindowSize(width, height);
// Set window title
glutCreateWindow("trebsim");
initGL();
// Set draw function
glutDisplayFunc(draw);
glutMainLoop();
return 0;
}
It is very likely that your object lies somewhere outside the view-frustum. Try setting the glClearColor to different values each frame, then you will see whether your render-loop is actually properly executed. If so, play with glTranslatef to try to move your object into view. Try negative values for the z-axis, it’s possible your object is rendered “behind” you.
Also:
You should CREATE the display list inside “initGL”.
In “draw” you should only execute/render your display list, using glCallList.
At the moment you create (but never delete) one DL every frame, so you actually have a memory leak.
Also add glDisable (GL_CULL_FACE) to initGL, otherwise it could be that you look at the back-side of the triangle and it is therefore culled away (not rendered).
I did what you suggested: it turns out the render loop was not executing properly. I added a call to glutPostRedisplay() after the glFlush() call to fix that problem. Still working on getting the object to be visible.
You should also create a doublebuffered format (glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH) and add a glutSwapBuffers at the end of each frame. Drop the display list code, you don’t need it for this and it’s only complicating things. Add a glViewport and set your projection matrix (via glOrtho, glFrustum or gluPerspective), then make your triangle smaller - 100s rather than 1000s, say, and see how you get on with that.