开发者

OpenGL rendering and TriangleBatch problems

so i'm following the "OpenGL superbible 5" and have encountered yet another issue: I'm trying to use GLTools.h, GLShaderManager, math3d.h, etc. to get the example code for the book, fresh from google Code, but all i get is a a blank white window.

Here's the code i'm running:

// Objects.cpp
// OpenGL SuperBible, Chapter 4
// Demonstrates GLTools built-in objects
// Program by Richard S. Wright Jr.

#include <GL/glew.h>
#include <GLTools.h>    // OpenGL toolkit
#include <GLMatrixStack.h>
#include <GLFrame.h>
#include <GLFrustum.h>
#include <GLBatch.h>
#include <GLGeometryTransform.h>

#include <math.h>
#ifdef __APPLE__
#include <glut/glut.h>
#else
#define FREEGLUT_STATIC
#include <GL/glut.h>
#endif

/////////////////////////////////////////////////////////////////////////////////
// An assortment of needed classes
GLShaderManager     shaderManager;
GLMatrixStack       modelViewMatrix;
GLMatrixStack       projectionMatrix;
GLFrame             cameraFrame;
GLFrame             objectFrame;
GLFrustum           viewFrustum;

GLTriangleBatch     sphereBatch;
GLTriangleBatch     torusBatch;
GLTriangleBatch     cylinderBatch;
GLTriangleBatch     coneBatch;
GLTriangleBatch     diskBatch;


GLGeometryTransform transformPipeline;
M3DMatrix44f        shadowMatrix;


GLfloat vGreen[] = { 0.0f, 1.0f, 0.0f, 1.0f };
GLfloat vBlack[] = { 0.0f, 0.0f, 0.0f, 1.0f };


// Keep track of effects step
int nStep = 0;


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

    shaderManager.InitializeStockShaders();

    glEnable(GL_DEPTH_TEST);

    transformPipeline.SetMatrixStacks(modelViewMatrix, projectionMatrix);

    cameraFrame.MoveForward(-15.0f);


    // Sphere
    gltMakeSphere(sphereBatch, 3.0, 10, 20);

    // Torus
    gltMakeTorus(torusBatch, 3.0f, 0.75f, 15, 15);

    // Cylinder
    gltMakeCylinder(cylinderBatch, 2.0f, 2.0f, 3.0f, 13, 2);

    // Cone
    gltMakeCylinder(coneBatch, 2.0f, 0.0f, 3.0f, 13, 2);

    // Disk
    gltMakeDisk(diskBatch, 1.5f, 3.0f, 13, 3);
    };


/////////////////////////////////////////////////////////////////////////
void DrawWireFramedBatch(GLTriangleBatch* pBatch)
    {
    shaderManager.UseStockShader(GLT_SHADER_FLAT, transformPipeline.GetModelViewProjectionMatrix(), vGreen);
    pBatch->Draw();

    // Draw black outline
    glPolygonOffset(-1.0f, -1.0f);
    glEnable(GL_LINE_SMOOTH);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glEnable(GL_POLYGON_OFFSET_LINE);
    glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
    glLineWidth(2.5f);
    shaderManager.UseStockShader(GLT_SHADER_FLAT, transformPipeline.GetModelViewProjectionMatrix(), vBlack);
    pBatch->Draw();

    // Restore polygon mode and depht testing
    glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
    glDisable(GL_POLYGON_OFFSET_LINE);
    glLineWidth(1.0f);
    glDisable(GL_BLEND);
    glDisable(GL_LINE_SMOOTH);
    };


///////////////////////////////////////////////////////////////////////////////
// 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);

    modelViewMatrix.PushMatrix();
        M3DMatrix44f mCamera;
        cameraFrame.GetCameraMatrix(mCamera);
        modelViewMatrix.MultMatrix(mCamera);

        M3DMatrix44f mObjectFrame;
        objectFrame.GetMatrix(mObjectFrame);
        modelViewMatrix.MultMatrix(mObjectFrame);

        shaderManager.UseStockShader(GLT_SHADER_FLAT, transformPipeline.GetModelViewProjectionMatrix(), vBlack);

        switch(nStep) {
            case 0:
                DrawWireFramedBatch(&sphereBatch);
                break;
            case 1:
                DrawWireFramedBatch(&torusBatch);
                break;
            case 2:
                DrawWireFramedBatch(&cylinderBatch);
                break;
            case 3:
                DrawWireFramedBatch(&coneBatch);
                break;
            case 4:
                DrawWireFramedBatch(&diskBatch);
                break;
            }

    modelViewMatrix.PopMatrix();

    // Flush drawing commands
    glutSwapBuffers();
    };


// Respond to arrow keys by moving the camera frame of reference
void SpecialKeys(int key, int x, int y)
    {
    if(key == GLUT_KEY_UP)
        objectFrame.RotateWorld(m3dDegToRad(-5.0f), 1.0f, 0.0f, 0.0f);

    if(key == GLUT_KEY_DOWN)
        objectFrame.RotateWorld(m3dDegToRad(5.0f), 1.0f, 0.0f, 0.0f);

    if(key == GLUT_KEY_LEFT)
        objectFrame.RotateWorld(m3dDegToRad(-5.0f), 0.0f, 1.0f, 0.0f);

    if(key == GLUT_KEY_RIGHT)
        objectFrame.RotateWorld(m3dDegToRad(5.0f), 0.0f, 1.0f, 0.0f);

    glutPostRedisplay();
    };




///////////////////////////////////////////////////////////////////////////////
// A normal ASCII key has been pressed.
// In this case, advance the scene when the space bar is pressed
void KeyPressFunc(unsigned char key, int x, int y)
    {
    if(key == 32)
        {
        nStep++;

        if(nStep > 4)
            nStep = 0;
        }

    switch(nStep)
        {
        case 0: 
            glutSetWindowTitle("Sphere");
            break;
        case 1:
            glutSetWindowTitle("Torus");
            break;
        case 2:
             glutSetWindowTitle("Cylinder");
            break;
        case 3:
            glutSetWindowTitle("Cone");
            break;
        case 4:
            glutSetWindowTitle("Disk");
            break;
        }

    glutPostRedisplay();
    };

///////////////////////////////////////////////////////////////////////////////
// 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);
    viewFrustum.SetPerspective(35.0f, float(w) / float(h), 1.0f, 500.0f);
    projectionMatrix.LoadMatrix(viewFrustum.GetProjectionMatrix());
    modelViewMatrix.LoadIdentity();
    };

///////////////////////////////////////////////////////////////////////////////
// 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("Sphere");
    glutReshapeFunc(ChangeSize);
    glutKeyboardFunc(KeyPressFunc);
    glutSpecialFunc(SpecialKeys);
    glutDisplayFunc(RenderScene);

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


    SetupRC();

    glutMainLoop();
    return 0;
    }

And here are the Errors popping up in the output text box in VS2010: A LOT of PDB files unfound (but i doubt this is the problem)

'TriangleBatch shapes.exe': Loaded 'C:\Windows\SysWOW64\ig4icd32.dll', Cannot find or open the PDB file
    'TriangleBatch shapes.exe': Loaded 'C:\Windows\SysWOW64\clbcatq.dll', Cannot find or open the PDB file
    'TriangleBatch shapes.exe': Loaded 'C:\Windows\SysWOW64\oleacc.dll', Cannot find开发者_如何学Python or open the PDB file

And A bunch of these errors after changing the size of or doing anything to the window..

First-chance exception at 0x02993890 in TriangleBatch shapes.exe: 0xC0000005: Access violation reading location 0x05bda35c.
First-chance exception at 0x02993890 in TriangleBatch shapes.exe: 0xC0000005: Access violation reading location 0x05bda35c.
First-chance exception at 0x02993890 in TriangleBatch shapes.exe: 0xC0000005: Access violation reading location 0x05bda35c.
First-chance exception at 0x02993890 in TriangleBatch shapes.exe: 0xC0000005: Access violation reading location 0x05bda35c.
First-chance exception at 0x02993890 in TriangleBatch shapes.exe: 0xC0000005: Access violation reading location 0x05bda35c.
First-chance exception at 0x02993890 in TriangleBatch shapes.exe: 0xC0000005: Access violation reading location 0x05bda35c.
First-chance exception at 0x02993890 in TriangleBatch shapes.exe: 0xC0000005: Access violation reading location 0x05bda35c.
First-chance exception at 0x02993890 in TriangleBatch shapes.exe: 0xC0000005: Access violation reading location 0x05bda35c.

Thanks for any input!! =)


For one, you're not setting FinalMatrix to anything before using it. I'm not familiar with GLTools, but is there some setup that it needs that you're missing?


It is possible that you do not have a projection matrix set which might explain the white render window.

During application initialisation use the following or similar to generate a projection matrix:

 glMatrixMode(GL_PROJECTION);   //changes the current matrix to the projection matrix

  //sets up the projection matrix for a perspective transform
  gluPerspective(45,     //view angle
                 1.0,    //aspect ratio
                 10.0,   //near clip
                 200.0); //far clip

glMatrixMode(GL_MODELVIEW); //changes the current matrix to the modelview matrix

(From GameDev.net )

You can calculate the aspect ratio by doing window width over height if you wish. Viewing angle, near and far clip planes are dependant on your application.

In order to use the glu function you will need glu.h included and glu.lib added as a library (although a quick look at the glew.h header makes it appear that the Glu header file should already be included).

The other issue may be that a view matrix has not been set. The GLFrame header appears to contain a camera system that can once you have set a camera position, look at vector (or point) and an up direction be used to generate the view matrix (GetCameraMatrix() I think ).

I'm currently uncertain what function could be used to set the view matrix with the libraries you are using at the moment

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜