我以前使用过OpenGL,已经有一段时间了,但是我并不认为这很糟糕。这段代码中我缺少一些东西。我只是想查看使用cube()函数绘制的多维数据集。

我做过/尝试过的事情...

  • 在主循环
  • 中翻转+和-z之间的转换
  • 在主循环之前打开/关闭背面剔除
  • 开头的
  • glLoadIdentity()
  • 在开头
  • 设置我的投影
    开头的
  • window.resetGLStates()
  • 开头的
  • window.setActive(true)
  • 确保我停留在glMatrixMode(GL_MODELVIEW)

  • 我想念什么?我所看到的只是我指定的清晰颜色,填满了屏幕并 mock 我。
    #include <SFML/System.hpp>
    #include <SFML/Window.hpp>
    #include <SFML/Graphics.hpp>
    #include <SFML/OpenGL.hpp>
    
    void cube();
    
    int gltest()
    {
        sf::RenderWindow window(sf::VideoMode(800, 600), "SFML works!", sf::Style::Default);
        window.setVerticalSyncEnabled(true);
        window.setActive(true);
        window.resetGLStates();
        sf::Vector2u wsize = window.getSize();
    
        glClearColor(0.3f, 0.3f, 0.3f, 1.f);
        glDepthMask(true);
        glEnable(GL_DEPTH_TEST);
        //to make sure I'm not missing anything here.
        glDisable(GL_CULL_FACE);
    
        glMatrixMode(GL_PROJECTION);
        glViewport(0, 0, wsize.x, wsize.y);
        gluPerspective(60, (float)wsize.x / (float)wsize.y, 0.1f, 512.f);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
    
        bool running = true;
        while(running)
        {
            sf::Event event;
            while(window.pollEvent(event))
            {
                switch(event.type)
                {
                    case sf::Event::KeyPressed:
                        if(event.key.code != sf::Keyboard::Escape) { break; }
                    case sf::Event::Closed:
                        running = false;
                        break;
                    case sf::Event::Resized:
                        wsize.x = event.size.width;
                        wsize.y = event.size.height;
                        glMatrixMode(GL_PROJECTION);
                        glViewport(0, 0, wsize.x, wsize.y);
                        gluPerspective(60.f, (float)wsize.x / (float)wsize.y, 0.1f, 512.f);
                        glMatrixMode(GL_MODELVIEW);
                        break;
                    default:
                        break;
                }
            }
    
            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    
                glPushMatrix();
                glTranslatef(0.f, 0.f, 5.f);
    
                    cube();
    
                glPopMatrix();
    
            window.display();
        }
    
        return 0;
    }
    
    void cube()
    {
    glBegin(GL_QUADS);      // Draw The Cube Using quads
        glColor3f(0.0f,1.0f,0.0f);  // Color Green
        glNormal3f(0.f, 1.f, 0.f);
        glVertex3f( 1.0f, 1.0f,-1.0f);  // Top Right Of The Quad (Top)
        glNormal3f(0.f, 1.f, 0.f);
        glVertex3f(-1.0f, 1.0f,-1.0f);  // Top Left Of The Quad (Top)
        glNormal3f(0.f, 1.f, 0.f);
        glVertex3f(-1.0f, 1.0f, 1.0f);  // Bottom Left Of The Quad (Top)
        glNormal3f(0.f, 1.f, 0.f);
        glVertex3f( 1.0f, 1.0f, 1.0f);  // Bottom Right Of The Quad (Top)
        glColor3f(1.0f,0.5f,0.0f);  // Color Orange
        glNormal3f(0.f, -1.f, 0.f);
        glVertex3f( 1.0f,-1.0f, 1.0f);  // Top Right Of The Quad (Bottom)
        glNormal3f(0.f, -1.f, 0.f);
        glVertex3f(-1.0f,-1.0f, 1.0f);  // Top Left Of The Quad (Bottom)
        glNormal3f(0.f, -1.f, 0.f);
        glVertex3f(-1.0f,-1.0f,-1.0f);  // Bottom Left Of The Quad (Bottom)
        glNormal3f(0.f, -1.f, 0.f);
        glVertex3f( 1.0f,-1.0f,-1.0f);  // Bottom Right Of The Quad (Bottom)
        glColor3f(1.0f, 0.0f, 0.0f);    // Color Red
        glNormal3f(0.f, 0.f, 1.f);
        glVertex3f( 1.0f, 1.0f, 1.0f);  // Top Right Of The Quad (Front)
        glNormal3f(0.f, 0.f, 1.f);
        glVertex3f(-1.0f, 1.0f, 1.0f);  // Top Left Of The Quad (Front)
        glNormal3f(0.f, 0.f, 1.f);
        glVertex3f(-1.0f,-1.0f, 1.0f);  // Bottom Left Of The Quad (Front)
        glNormal3f(0.f, 0.f, 1.f);
        glVertex3f( 1.0f,-1.0f, 1.0f);  // Bottom Right Of The Quad (Front)
        glColor3f(1.0f, 1.0f, 0.0f);    // Color Yellow
        glNormal3f(0.f, 0.f, -1.f);
        glVertex3f( 1.0f,-1.0f,-1.0f);  // Top Right Of The Quad (Back)
        glNormal3f(0.f, 0.f, -1.f);
        glVertex3f(-1.0f,-1.0f,-1.0f);  // Top Left Of The Quad (Back)
        glNormal3f(0.f, 0.f, -1.f);
        glVertex3f(-1.0f, 1.0f,-1.0f);  // Bottom Left Of The Quad (Back)
        glNormal3f(0.f, 0.f, -1.f);
        glVertex3f( 1.0f, 1.0f,-1.0f);  // Bottom Right Of The Quad (Back)
        glColor3f(0.0f, 0.0f, 1.0f);    // Color Blue
        glNormal3f(-1.f, 0.f, 0.f);
        glVertex3f(-1.0f, 1.0f, 1.0f);  // Top Right Of The Quad (Left)
        glNormal3f(-1.f, 0.f, 0.f);
        glVertex3f(-1.0f, 1.0f,-1.0f);  // Top Left Of The Quad (Left)
        glNormal3f(-1.f, 0.f, 0.f);
        glVertex3f(-1.0f,-1.0f,-1.0f);  // Bottom Left Of The Quad (Left)
        glNormal3f(-1.f, 0.f, 0.f);
        glVertex3f(-1.0f,-1.0f, 1.0f);  // Bottom Right Of The Quad (Left)
        glColor3f(1.0f, 0.0f, 1.0f);    // Color Violet
        glNormal3f(1.f, 0.f, 0.f);
        glVertex3f( 1.0f, 1.0f,-1.0f);  // Top Right Of The Quad (Right)
        glNormal3f(1.f, 0.f, 0.f);
        glVertex3f( 1.0f, 1.0f, 1.0f);  // Top Left Of The Quad (Right)
        glNormal3f(1.f, 0.f, 0.f);
        glVertex3f( 1.0f,-1.0f, 1.0f);  // Bottom Left Of The Quad (Right)
        glNormal3f(1.f, 0.f, 0.f);
        glVertex3f( 1.0f,-1.0f,-1.0f);  // Bottom Right Of The Quad (Right)
      glEnd();          // End Drawing The Cube
    }
    

    最佳答案

    这里:

    glMatrixMode(GL_PROJECTION);
    glViewport(0, 0, wsize.x, wsize.y);
    gluPerspective(60, (float)wsize.x / (float)wsize.y, 0.1f, 512.f);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    

    和这里:
    wsize.x = event.size.width;
    wsize.y = event.size.height;
    glMatrixMode(GL_PROJECTION);
    glViewport(0, 0, wsize.x, wsize.y);
    gluPerspective(60.f, (float)wsize.x / (float)wsize.y, 0.1f, 512.f);
    glMatrixMode(GL_MODELVIEW);
    

    glLoadIdentity()glMatrixMode(GL_PROJECTION)调用之后添加glMatrixMode(GL_MODELVIEW)
    gluPerspective()将一个矩阵与当前矩阵相乘。该代码似乎是假设它覆盖了当前矩阵。

    自身乘以多次的gluPerspective()矩阵不是有意义的投影矩阵。

    在此期间,您可以删除调整大小处理程序:
    #include <SFML/System.hpp>
    #include <SFML/Window.hpp>
    #include <SFML/Graphics.hpp>
    #include <SFML/OpenGL.hpp>
    
    void cube()
    {
        glBegin(GL_QUADS);      // Draw The Cube Using quads
    
        glColor3f(0.0f,1.0f,0.0f);  // Color Green
        glNormal3f(0.f, 1.f, 0.f);
        glVertex3f( 1.0f, 1.0f,-1.0f);  // Top Right Of The Quad (Top)
        glNormal3f(0.f, 1.f, 0.f);
        glVertex3f(-1.0f, 1.0f,-1.0f);  // Top Left Of The Quad (Top)
        glNormal3f(0.f, 1.f, 0.f);
        glVertex3f(-1.0f, 1.0f, 1.0f);  // Bottom Left Of The Quad (Top)
        glNormal3f(0.f, 1.f, 0.f);
        glVertex3f( 1.0f, 1.0f, 1.0f);  // Bottom Right Of The Quad (Top)
    
        glColor3f(1.0f,0.5f,0.0f);  // Color Orange
        glNormal3f(0.f, -1.f, 0.f);
        glVertex3f( 1.0f,-1.0f, 1.0f);  // Top Right Of The Quad (Bottom)
        glNormal3f(0.f, -1.f, 0.f);
        glVertex3f(-1.0f,-1.0f, 1.0f);  // Top Left Of The Quad (Bottom)
        glNormal3f(0.f, -1.f, 0.f);
        glVertex3f(-1.0f,-1.0f,-1.0f);  // Bottom Left Of The Quad (Bottom)
        glNormal3f(0.f, -1.f, 0.f);
        glVertex3f( 1.0f,-1.0f,-1.0f);  // Bottom Right Of The Quad (Bottom)
    
        glColor3f(1.0f, 0.0f, 0.0f);    // Color Red
        glNormal3f(0.f, 0.f, 1.f);
        glVertex3f( 1.0f, 1.0f, 1.0f);  // Top Right Of The Quad (Front)
        glNormal3f(0.f, 0.f, 1.f);
        glVertex3f(-1.0f, 1.0f, 1.0f);  // Top Left Of The Quad (Front)
        glNormal3f(0.f, 0.f, 1.f);
        glVertex3f(-1.0f,-1.0f, 1.0f);  // Bottom Left Of The Quad (Front)
        glNormal3f(0.f, 0.f, 1.f);
        glVertex3f( 1.0f,-1.0f, 1.0f);  // Bottom Right Of The Quad (Front)
    
        glColor3f(1.0f, 1.0f, 0.0f);    // Color Yellow
        glNormal3f(0.f, 0.f, -1.f);
        glVertex3f( 1.0f,-1.0f,-1.0f);  // Top Right Of The Quad (Back)
        glNormal3f(0.f, 0.f, -1.f);
        glVertex3f(-1.0f,-1.0f,-1.0f);  // Top Left Of The Quad (Back)
        glNormal3f(0.f, 0.f, -1.f);
        glVertex3f(-1.0f, 1.0f,-1.0f);  // Bottom Left Of The Quad (Back)
        glNormal3f(0.f, 0.f, -1.f);
        glVertex3f( 1.0f, 1.0f,-1.0f);  // Bottom Right Of The Quad (Back)
    
        glColor3f(0.0f, 0.0f, 1.0f);    // Color Blue
        glNormal3f(-1.f, 0.f, 0.f);
        glVertex3f(-1.0f, 1.0f, 1.0f);  // Top Right Of The Quad (Left)
        glNormal3f(-1.f, 0.f, 0.f);
        glVertex3f(-1.0f, 1.0f,-1.0f);  // Top Left Of The Quad (Left)
        glNormal3f(-1.f, 0.f, 0.f);
        glVertex3f(-1.0f,-1.0f,-1.0f);  // Bottom Left Of The Quad (Left)
        glNormal3f(-1.f, 0.f, 0.f);
        glVertex3f(-1.0f,-1.0f, 1.0f);  // Bottom Right Of The Quad (Left)
    
        glColor3f(1.0f, 0.0f, 1.0f);    // Color Violet
        glNormal3f(1.f, 0.f, 0.f);
        glVertex3f( 1.0f, 1.0f,-1.0f);  // Top Right Of The Quad (Right)
        glNormal3f(1.f, 0.f, 0.f);
        glVertex3f( 1.0f, 1.0f, 1.0f);  // Top Left Of The Quad (Right)
        glNormal3f(1.f, 0.f, 0.f);
        glVertex3f( 1.0f,-1.0f, 1.0f);  // Bottom Left Of The Quad (Right)
        glNormal3f(1.f, 0.f, 0.f);
        glVertex3f( 1.0f,-1.0f,-1.0f);  // Bottom Right Of The Quad (Right)
    
        glEnd();          // End Drawing The Cube
    }
    
    int main()
    {
        sf::RenderWindow window(sf::VideoMode(800, 600), "SFML works!", sf::Style::Default);
        window.setVerticalSyncEnabled(true);
        window.setActive(true);
        window.resetGLStates();
    
        bool running = true;
        while(running)
        {
            sf::Event event;
            while(window.pollEvent(event))
            {
                switch(event.type)
                {
                case sf::Event::KeyPressed:
                    if(event.key.code != sf::Keyboard::Escape) { break; }
                case sf::Event::Closed:
                    running = false;
                    break;
                default:
                    break;
                }
            }
    
            glClearColor(0.3f, 0.3f, 0.3f, 1.f);
            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    
            glMatrixMode(GL_PROJECTION);
            glLoadIdentity();
            sf::Vector2u wsize = window.getSize();
            glViewport(0, 0, wsize.x, wsize.y);
            gluPerspective(60, (float)wsize.x / (float)wsize.y, 0.1f, 512.f);
    
            glMatrixMode(GL_MODELVIEW);
            glLoadIdentity();
    
            glPushMatrix();
            glTranslatef(0.f, 0.f, -5.f);
    
            cube();
    
            glPopMatrix();
    
            GLenum err = glGetError();
    
            window.display();
        }
    
        return 0;
    }
    

    10-07 19:11