为什么这个openGL代码没有输出任何东西?

时间:2011-11-28 21:34:48

标签: c++ visual-c++ opengl

以下是使用LorenzAttractor绘制SubWindows的cpp代码。请让我知道为什么代码没有显示任何原语..惊讶为什么甚至坐标轴都没有显示..

  1. Main.cpp http://pastebin.com/bGqcBzfJ
  2. OpenGLFramework.h http://pastebin.com/8L3gk5uD
  3. MyFramework.h http://pastebin.com/CZfskfVF
  4. LorenzAttractor.h http://pastebin.com/t6GN1khg
  5. 请耐心地为我编写.h文件中的函数。

    编辑:OpenGLFramework是一个基类,正在由MyFramework类扩展。我设置了参数,然后调用startFramework()开始在屏幕上渲染数字。

    我检查了我使用的每一个OpenGL函数,但无法弄清楚为什么输出是一个blanck屏幕。请建议以及用于调试OpenGL程序的任何工具?调试是图形中令人头痛的事情:(。

    代码段:

    void startFramework(int argc, char *argv[]) {
    
                        setInstance();
    
                        // Initialize GLUT
                        glutInit(&argc, argv);
                        glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
                        glutInitWindowPosition(WINDOW_X_POSITION, WINDOW_Y_POSITION);
                        glutInitWindowSize(width, height);
    
                        mainWindow = glutCreateWindow(instance->title.c_str());
                        glutSetWindow(mainWindow);
    
                        // callbacks for main window
                        glutDisplayFunc(renderMainWindow);
                        glutReshapeFunc(changeSizeWrapper);
                        glutIdleFunc(renderSceneAllWrapper);
    
                        //subwindows
                        int subwindowWidth = (width - numberOfSubWindows * border) / numberOfSubWindows;
                        int subWindowHeight = height - border;
    
                        for(unsigned int i = 0; i < numberOfSubWindows; i++) {
                                subWindow[i] = glutCreateSubWindow(mainWindow, (i * width / numberOfSubWindows) + (border / 2), border / 2, subwindowWidth, subWindowHeight);
                                glutSetWindow(subWindow[i]);
                                glutDisplayFunc(renderWrapper);
    
                                glEnable(GL_DEPTH_TEST);
                                glEnable(GL_CULL_FACE);
    
                                // register callbacks
                                //glutIgnoreKeyRepeat(1);
                                glutKeyboardFunc(processNormalKeysWrapper);
                                glutSpecialFunc(pressKeyWrapper);
                                glutSpecialUpFunc(releaseKeyWrapper);
                                glutMouseFunc(mouseButtonWrapper);
                        }      
    
                        glutMainLoop();
                }
    

    renderWrapper()会调用draw() ..

    void draw() {
                            if( 1 == getNumberOfSubWindows() ) {
                                            setWindowContext(0);
    
                                            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
                                            glLoadIdentity();
                                            glMatrixMode(GL_MODELVIEW);
    
                                            invokeGlutLookAt();
    
                                            draw3DCoordinateAxis();
    
                                            for(unsigned int i = 0; i < numLorenzAttractors; i++) {
                                                    lorenzAttractor[i].simulate();
                                            }
    
                                            glutSwapBuffers();
                            } else if( getNumberOfSubWindows() == numLorenzAttractors ) {
                                    for(unsigned int i = 0; i < numLorenzAttractors; i++) {
                                            setWindowContext(i);
    
                                            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
                                            glLoadIdentity();
                                            glMatrixMode(GL_MODELVIEW);
    
                                            invokeGlutLookAt();
    
                                            draw3DCoordinateAxis();
                                            lorenzAttractor[i].simulate();
    
                                            glutSwapBuffers();
                                    }
                            }
                    }
    

1 个答案:

答案 0 :(得分:1)

好吧,如果你在draw()中设置矩阵,glLoadIdentity()应该在glMatrixMode(GL_MODELVIEW)之后,至少如果你想设置模型视图矩阵,我看不到pojection矩阵。默认情况下,OpenGl在所有3个维度的[0,1]范围内绘制唯一的东西,并使用投影矩阵将其转换为您想要的角度和大小,因此如果您没有设置投影矩阵,您将赢得'什么都看不见。

无论如何,我甚至不明白你的代码是做什么的......