Can not run simple GLUT code.

Hi folks,

I want to start learning OpenGL. So I got myself the Superbible (5th edition) and followed all instructions. Here’s the first code sample:


// Triangle.cpp
// Our first OpenGL program that will just draw a triangle on the screen.

#include <GLTools.h>            // OpenGL toolkit
#include <GLShaderManager.h>    // Shader Manager Class

#ifdef __APPLE__
#include <glut/glut.h>          // OS X version of GLUT
#else
#define FREEGLUT_STATIC
#include <GL/glut.h>            // Windows FreeGlut equivalent
#endif

GLBatch triangleBatch;
GLShaderManager shaderManager;

///////////////////////////////////////////////////////////////////////////////
// Window has changed size, or has just been created. In either case, we need
// to use the window dimensions to set the viewport and the projection matrix.
void ChangeSize(int w, int h)
    {
    glViewport(0, 0, w, h);
    }


///////////////////////////////////////////////////////////////////////////////
// This function does any needed initialization on the rendering context. 
// This is the first opportunity to do any OpenGL related tasks.
void SetupRC()
    {
    // Blue background
    glClearColor(0.0f, 0.0f, 1.0f, 1.0f );

    shaderManager.InitializeStockShaders();

    // Load up a triangle
    GLfloat vVerts[] = { -0.5f, 0.0f, 0.0f, 
                          0.5f, 0.0f, 0.0f,
                          0.0f, 0.5f, 0.0f };

    triangleBatch.Begin(GL_TRIANGLES, 3);
    triangleBatch.CopyVertexData3f(vVerts);
    triangleBatch.End();
    }



///////////////////////////////////////////////////////////////////////////////
// Called to draw scene
void RenderScene(void)
    {
    // Clear the window with current clearing color
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);

    GLfloat vRed[] = { 1.0f, 0.0f, 0.0f, 1.0f };
    shaderManager.UseStockShader(GLT_SHADER_IDENTITY, vRed);
    triangleBatch.Draw();

    // Perform the buffer swap to display back buffer
    glutSwapBuffers();
    }


///////////////////////////////////////////////////////////////////////////////
// Main entry point for GLUT based programs
int main(int argc, char* argv[])
    {
    gltSetWorkingDirectory(argv[0]);

    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH|GLUT_STENCIL);
    glutInitWindowSize(800,600);
    glutCreateWindow("Triangle");
    glutReshapeFunc(ChangeSize);
    glutDisplayFunc(RenderScene);

    GLenum err = glewInit();

    if(GLEW_OK != err){
        fprintf(stderr, "GLEW Error: %s
", glewGetErrorString(err));
        return 1;
    }
    SetupRC();

    glutMainLoop();
    return 0;

    }

But somehow I alway run into a “Unhandled exception at 0x00000000 in Triangle.exe: 0x00000005: Access violation reading location 0x00000000”.

Using the debugger it seems the problem lies in SetupRC(). The error occurs when the triangleBatch code is executed. If I comment out trianglebatch.Begin(); + …CopyVertexData3f(vVerts); + triangleBatch.end(); It works and shows the “scene”.

Another issue was that after loading “freeglut_static.lib” I got a message from VS-2008, that there are no rules defined for reading this library. Could this be the problem? If so how could I solve it?

Thanks in advance!

Which GL version are you running?
Which function is causing the crash? You have to determine that for yourself.

I am running GL 3.0, the one you can download for this book.

I actually know that it is in the SetupRC()-function, caused by the trianglebatch-statements. But I do not understand why.

You can’t download OpenGL from some random site. Check what GL version your machine supports.
Use glGetString(GL_VERSION) to find out.

http://www.opengl.org/wiki/FAQ#How_do_I_tell_what_version_of_OpenGL_I.27m_using.3F

Add glewExperimental=GL_TRUE; before this line

 GLenum err = glewInit();

and tell us if u still get exception.