Start Building 3D games Using OpenGL Utility Toolkit (GLUT)

GLUT (pronounced like the glut in gluttony) is the OpenGL Utility Toolkit, a window system independent toolkit for writing OpenGL programs. It implements a simple windowing application programming interface (API) for OpenGL. GLUT makes it considerably easier to learn about and explore OpenGL programming. GLUT provides a portable API so you can write a single OpenGL program that works across all PC and workstation OS platforms.

GLUT is designed for constructing small to medium sized OpenGL programs. While GLUT is well-suited to learning OpenGL and developing simple OpenGL applications, GLUT is not a full-featured toolkit so large applications requiring sophisticated user interfaces are better off using native window system toolkits. GLUT is simple, easy, and small.

The GLUT library has both C, C++ (same as C), FORTRAN, and Ada programming bindings. The GLUT source code distribution is portable to nearly all OpenGL implementations and platforms. The current version is 3.7. Additional releases of the library are not anticipated.

GLUT is not open source. Mark Kilgard maintains the copyright. There are a number of newer and open source alternatives.

The current version of the GLUT API is 3.
The current source code distribution is GLUT 3.7.

The toolkit supports:

  • Multiple windows for OpenGL rendering
  • Callback driven event processing
  • Sophisticated input devices
  • An ‘idle’ routine and timers
  • A simple, cascading pop-up menu facility
  • Utility routines to generate various solid and wire frame objects
  • Support for bitmap and stroke fonts
  • Miscellaneous window management function

    – SOURCE: https://opengl.org

So using GLUT you can make a 3D GAME!!. Lets start building the game now. First of all you need to setup GLUT library on your IDE. If you are using Code::Blocks then Click Here for the steps to setup. The example below is a simple game using GLUT

 
#include 
 
#include 
 
 
 
 
 
static int slices = 16;
 
static int stacks = 16;
 
 
 
/* GLUT callback Handlers */
 
 
 
static void resize(int width, int height)
 
{
 
    const float ar = (float) width / (float) height;
 
 
 
    glViewport(0, 0, width, height);
 
    glMatrixMode(GL_PROJECTION);
 
    glLoadIdentity();
 
    glFrustum(-ar, ar, -1.0, 1.0, 2.0, 100.0);
 
 
 
    glMatrixMode(GL_MODELVIEW);
 
    glLoadIdentity() ;
 
}
 
 
 
static void display(void)
 
{
 
    const double t = glutGet(GLUT_ELAPSED_TIME) / 1000.0;
 
    const double a = t*90.0;
 
 
 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
    glColor3d(1,0,0);
 
 
 
    glPushMatrix();
 
        glTranslated(-2.4,1.2,-6);
 
        glRotated(60,1,0,0);
 
        glRotated(a,0,0,1);
 
        glutSolidSphere(1,slices,stacks);
 
    glPopMatrix();
 
 
 
    glPushMatrix();
 
        glTranslated(0,1.2,-6);
 
        glRotated(60,1,0,0);
 
        glRotated(a,0,0,1);
 
        glutSolidCone(1,1,slices,stacks);
 
    glPopMatrix();
 
 
 
    glPushMatrix();
 
        glTranslated(2.4,1.2,-6);
 
        glRotated(60,1,0,0);
 
        glRotated(a,0,0,1);
 
        glutSolidTorus(0.2,0.8,slices,stacks);
 
    glPopMatrix();
 
 
 
    glPushMatrix();
 
        glTranslated(-2.4,-1.2,-6);
 
        glRotated(60,1,0,0);
 
        glRotated(a,0,0,1);
 
        glutWireSphere(1,slices,stacks);
 
    glPopMatrix();
 
 
 
    glPushMatrix();
 
        glTranslated(0,-1.2,-6);
 
        glRotated(60,1,0,0);
 
        glRotated(a,0,0,1);
 
        glutWireCone(1,1,slices,stacks);
 
    glPopMatrix();
 
 
 
    glPushMatrix();
 
        glTranslated(2.4,-1.2,-6);
 
        glRotated(60,1,0,0);
 
        glRotated(a,0,0,1);
 
        glutWireTorus(0.2,0.8,slices,stacks);
 
    glPopMatrix();
 
 
 
    glutSwapBuffers();
 
}
 
 
 
 
 
static void key(unsigned char key, int x, int y)
 
{
 
    switch (key)
 
    {
 
        case 27 :
 
        case 'q':
 
            exit(0);
 
            break;
 
 
 
        case '+':
 
            slices++;
 
            stacks++;
 
            break;
 
 
 
        case '-':
 
            if (slices>3 && stacks>3)
 
            {
 
                slices--;
 
                stacks--;
 
            }
 
            break;
 
    }
 
 
 
    glutPostRedisplay();
 
}
 
 
 
static void idle(void)
 
{
 
    glutPostRedisplay();
 
}
 
 
 
const GLfloat light_ambient[]  = { 0.0f, 0.0f, 0.0f, 1.0f };
 
const GLfloat light_diffuse[]  = { 1.0f, 1.0f, 1.0f, 1.0f };
 
const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
 
const GLfloat light_position[] = { 2.0f, 5.0f, 5.0f, 0.0f };
 
 
 
const GLfloat mat_ambient[]    = { 0.7f, 0.7f, 0.7f, 1.0f };
 
const GLfloat mat_diffuse[]    = { 0.8f, 0.8f, 0.8f, 1.0f };
 
const GLfloat mat_specular[]   = { 1.0f, 1.0f, 1.0f, 1.0f };
 
const GLfloat high_shininess[] = { 100.0f };
 
 
 
/* Program entry point */
 
 
 
int main(int argc, char *argv[])
 
{
 
    glutInit(&argc, argv);
 
    glutInitWindowSize(640,480);
 
    glutInitWindowPosition(10,10);
 
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
 
 
 
    glutCreateWindow("GLUT Shapes");
 
 
 
    glutReshapeFunc(resize);
 
    glutDisplayFunc(display);
 
    glutKeyboardFunc(key);
 
    glutIdleFunc(idle);
 
 
 
    glClearColor(1,1,1,1);
 
    glEnable(GL_CULL_FACE);
 
    glCullFace(GL_BACK);
 
 
 
    glEnable(GL_DEPTH_TEST);
 
    glDepthFunc(GL_LESS);
 
 
 
    glEnable(GL_LIGHT0);
 
    glEnable(GL_NORMALIZE);
 
    glEnable(GL_COLOR_MATERIAL);
 
    glEnable(GL_LIGHTING);
 
 
 
    glLightfv(GL_LIGHT0, GL_AMBIENT,  light_ambient);
 
    glLightfv(GL_LIGHT0, GL_DIFFUSE,  light_diffuse);
 
    glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
 
    glLightfv(GL_LIGHT0, GL_POSITION, light_position);
 
 
 
    glMaterialfv(GL_FRONT, GL_AMBIENT,   mat_ambient);
 
    glMaterialfv(GL_FRONT, GL_DIFFUSE,   mat_diffuse);
 
    glMaterialfv(GL_FRONT, GL_SPECULAR,  mat_specular);
 
    glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);
 
 
 
    glutMainLoop();
 
 
 
    return EXIT_SUCCESS;
 
}
 
 
 

Output