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
精彩评论