Проблемы рендеринга OpenGL и TriangleBatch - PullRequest
1 голос
/ 24 апреля 2011

, поэтому я слежу за "OpenGL superbible 5" и столкнулся с еще одной проблемой: Я пытаюсь использовать GLTools.h, GLShaderManager, math3d.h и т. Д., Чтобы получить пример кода для книги, только что из Google Code, но Все, что я получаю, это пустое белое окно.

Вот код, который я запускаю:

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

И вот ошибки, появляющиеся в текстовом поле вывода в VS2010: Множество файлов PDB не найдено (но я сомневаюсь, что это проблема)

'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 or open the PDB file

И куча этих ошибок после изменения размера или выполнения каких-либо действий с окном ..

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.

Спасибо за любой вклад !! =)

Ответы [ 2 ]

1 голос
/ 24 апреля 2011

Во-первых, вы не устанавливаете FinalMatrix ни перед чем.Я не знаком с GLTools, но есть ли какие-то настройки, в которых он нуждается, что вы упускаете?

0 голосов
/ 24 апреля 2011

Возможно, у вас нет набора матриц проекции, который мог бы объяснить окно визуализации белого цвета.

Во время инициализации приложения используйте следующую или похожую информацию для создания матрицы проекции:

 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

(от GameDev.net )

Вы можете рассчитать соотношение сторон, сделав ширину окна по высоте, если хотите. Угол обзора, ближняя и дальняя плоскости отсечения зависят от вашего приложения.

Чтобы использовать функцию glu, вам потребуется включить glu.h и добавить glu.lib в качестве библиотеки (хотя быстрый просмотр заголовка glew.h показывает, что файл заголовка Glu уже должен быть включен).

Другая проблема может заключаться в том, что матрица представления не была установлена. Заголовок GLFrame, по-видимому, содержит систему камер, которая может, как только вы установите положение камеры, посмотрите на вектор (или точку) и направление вверх, чтобы использовать матрицу вида (я думаю, GetCameraMatrix ()).

В настоящее время я не уверен, какую функцию можно использовать для установки матрицы представления с библиотеками, которые вы используете в данный момент

...