#include <GLUT/GLUT.h>
#include <OpenGL/OpenGL.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h> // Header file for sleeping
/* ASCII code for the escape key. */
#define ESCAPE 27
/* The number of our GLUT window */
int window;
/* A general OpenGL initialization function. Sets all of the initial parameters. */
/* We call this right after our OpenGL window is created. */
void initGL(int width, int height)
{
glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // This will clear the background oclor to black
glClearDepth(1.0); // Enable clearing of the depth buffer
glDepthFunc(GL_LESS); // The type depth test to do
glEnable(GL_DEPTH_TEST); // Enables depth testing
glShadeModel(GL_SMOOTH); // Enables smooth color shading
glMatrixMode(GL_PROJECTION);
glLoadIdentity(); // Reset the projection matrix
// Calculate the aspect ratio of the window
gluPerspective(45.0f, (GLfloat)width/ (GLfloat)height, 0.1f, 100.0f);
glMatrixMode(GL_MODELVIEW);
}
/* The function called when our window is resized (which shouldn't happend,
because we're fullscreen) */
void resizeGLScene(int width, int height)
{
if (height == 0) // Prevent A devide by zero if the window is too small
height = 1;
glViewport(0, 0, width, height); // Reset teh current viewport and perspective transformation
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f, (GLfloat)width / (GLfloat)height, 0.1f, 100.0f);
glMatrixMode(GL_MODELVIEW);
}
/* The main drawing function. */
void drawGLScene()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear the screen and the depth.
glLoadIdentity(); // Reset the view
glTranslatef(-1.5f, 0.0f, -6.0f); // Move left 1.5 units and into the screen 6.0
// Draw a triangle
glBegin(GL_POLYGON);
glVertex3f( 0.0f, 1.0f, 0.0f); // Top
glVertex3f( 1.0f, -1.0f, 0.0f); // Bottom Right
glVertex3f(-1.0f, -1.0f, 0.0f); // Bottom Left
glEnd(); // We're doen with the polygon
glTranslatef(3.0f, 0.0f, 0.0f); // Move Right 3 units (将下面的四边形往右移动)
// Draw a square (quadrilateral)
glBegin(GL_QUADS); // Start drawing a polygon (4 sided)
glVertex3f(-1.0f, 1.0f, 0.0f); // top left
glVertex3f( 1.0f, 1.0f, 0.0f); // top right
glVertex3f( 1.0f, -1.0f, 0.0f); // bottom right
glVertex3f(-1.0f, -1.0f, 0.0f); // Bottom left
glEnd(); // done with the polygon
// swap buffers to display, since we're doouble buffered.
glutSwapBuffers();
}
/* the function claled whever a key is pressed. */
void keyPressed(unsigned char key, int x, int y)
{
/* avoid thrashing this procedure */
/* If escape is pressed. kill everything. */
if (key == ESCAPE) {
/* shut down our window */
glutDestroyWindow(window);
/* exit teh program ... normal termination. */
exit(0);
}
}
int main(int argc, char **argv)
{
glutInit(&argc, argv);
/* Select type of Display mode:
Double buffer
RGBA color
Alpha components supported
Depth buffer */
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_ALPHA | GLUT_DEPTH);
/* get a 640 x 480 window */
glutInitWindowSize(640, 480);
/* the window starts at the upper left corner of teh screen */
glutInitWindowPosition(0, 0);
/* Open a window */
window = glutCreateWindow("Jeff Molefee's GL Code Tutorial .. NeHe '99");
/* Register the function to do all our OpenGL drwing. */
glutDisplayFunc(&drawGLScene);
/* GO fullscreen. This is the soonest we could possibly go fullscreen. */
// glutFullScreen();
/* Even if there are no events, redraw our gl scene. */
glutIdleFunc(&drawGLScene);
/* Register the function called when our window is resized. */
glutReshapeFunc(&resizeGLScene);
/* Register teh function claled when the keyboard is pressed. */
glutKeyboardFunc(&keyPressed);
/* Initialzie our window */
initGL(640, 480);
/* Start event processing engine */
glutMainLoop();
return 0;
}
Mac OS X 运行命令:
$: clang -o lession lession2.c -Wno-deprecated -framework OpenGL -framework GLUT
$: ./lession