OpenGL吸引麻烦

OpenGL Draw Trouble

本文关键字:麻烦 OpenGL      更新时间:2023-10-16

我为OpenGL做了一个加载程序,该加载程序读取顶点,正常以及所有这些东西都按顺序排列。加载程序是正确的,我已经检查了所有值,它应该是。由于某种原因,我仍然实际上无法在屏幕上获得任何内容。

    #include <SFML/Graphics.hpp>
#include <SFML/OpenGL.hpp>
#include "Loader.h"
#define SC_WIDTH 600
#define SC_HEIGHT 600
#define REFRESH_RATE 0.03f
loader load;
int main()
{
    // Create the main window
     sf::Window App(sf::VideoMode(SC_WIDTH, SC_HEIGHT, 32), "SFML OpenGL");
    // Create a clock for measuring time elapsed
    sf::Clock clock;
    //load file
    load.openFile();
    // Set color and depth clear value
    glClearDepth(1.f);
    glClearColor(0.f, 0.f, 0.f, 0.f);
    // Enable Z-buffer read and write
    glEnable(GL_DEPTH_TEST);
    glDepthMask(GL_TRUE);

    //lighing
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_NORMAL_ARRAY);
    glVertexPointer(3,GL_FLOAT,0,&load.totalVertices);
    glNormalPointer(GL_FLOAT,0,&load.faceNormal);
     // Setup a perspective projection
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(90.f, 1.f, 1.f, 500.f);
    // Start game loop
    while (App.isOpen())
    {
        // Process events
        sf::Event Event;
        while (App.pollEvent(Event))
        {
            // Close window : exit
            if (Event.type == sf::Event::Closed)
                App.close();
            // Escape key : exit
            if ((Event.type == sf::Event::KeyPressed) && (Event.key.code == sf::Keyboard::Escape))
                App.close();
            // Resize event : adjust viewport
            if (Event.type == sf::Event::Resized)
               glViewport(0, 0, Event.size.width, Event.size.height);
        }
        // Set the active window before using OpenGL commands
        // It's useless here because active window is always the same,
        // but don't forget it if you use multiple windows or controls
        App.setActive();

        if((float)clock.getElapsedTime().asSeconds()>REFRESH_RATE){
            // Clear colour and depth buffer
            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
            glMatrixMode(GL_MODELVIEW);
            glLoadIdentity();
            glPopMatrix();
            glTranslatef(0.f,0.f,-10.f);
            glDrawArrays(GL_TRIANGLES, 0,(GLsizei)(load.totalVertices.size()/3));
            glPushMatrix();
            clock.restart();
        }

        // Finally, display rendered frame on screen
        App.display();
    }
    glDisableClientState(GL_VERTEX_ARRAY);
    glDisableClientState(GL_NORMAL_ARRAY);
    return EXIT_SUCCESS;
}

对于一件事,您在呼叫glDrawArrays (...)中将顶点数除以3,这使我相信您认为参数是三角形的数量(或更一般的,原始数量)。不是,它是顶点的数量。您不应除以3。

要注意的另一件事是,您以错误的顺序调用glPopMatrix (...)glPushMatrix (...)。基本上,您第一次尝试绘制任何东西时,您基本上要下水矩阵堆栈。您可以交换两个呼叫并解决此问题,但是说实话,这首先不是必需的,因为您在调用glTranslatef (...)之前已经加载了身份矩阵。