【问题标题】:OpenGL do not render anythingOpenGL 不渲染任何东西
【发布时间】:2022-11-21 06:20:12
【问题描述】:

我正在关注 3DBuzz.com 上有关 OpenGL 的一系列教程。 这些教程是使用 SDL 1 制作的,但现在我使用的是 SDL2。 我已尝试将我能做的一切迁移到最新版本的 SDL2,一切都已正确链接并且整个库都在正常工作。我认为错误出现在第 140 行,原始视频中的调用如下:SDL_GL_SwapBuffers() 但现在在 SDL2 中你应该知道已更改为 SDL_GL_SwapWindow() 但我无法调用变量(屏幕),因为它是在主要功能内。 这会给我一个错误,我不知道如何解决这个问题。所以,对于那些是SDL2大师的人我希望你能帮助我。 这是完整的代码,所以你可以告诉我我做错了什么:

#include "SDL.h"
#include <stdio.h>
#include <stdlib.h>

#define GLUT_DISABLE_ATEXIT_HACK

#if defined (_WIN32) || defined(_WIN64)
    #define WIN32_LEAN_AND_MEAN
    #include <windows.h>
#endif // WIN32

#if defined(__APPLE__) && defined(__MACH__)
    #include <OpenGL/gl.h>
    #include <OpenGL/glu.h>
#else
    #include <GL/gl.h>
    #include <GL/glut.h>
#endif // defined

const GLsizei windowWidth = 500;
const GLsizei windowHeight = 500;

GLfloat cubeRotateX = 45.0f;
GLfloat cubeRotateY = 45.0f;

const Uint8 *keys = NULL;

GLvoid establishProjectionMatrix(GLsizei width, GLsizei height)
{
    glViewport(0, 0, width, height);

    glMatrixMode(GL_PROJECTION);

    glLoadIdentity();

    gluPerspective(50.0f, (GLfloat)width / (GLfloat)height, 0.1f, 200.0f);
}

GLvoid initGL(GLsizei width, GLsizei height)
{
    establishProjectionMatrix(width, height);

    glShadeModel(GL_SMOOTH);

    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LEQUAL);

    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
    glEnable(GL_PERSPECTIVE_CORRECTION_HINT);

}

GLvoid displayFPS(GLvoid)
{
    static long lastTime = SDL_GetTicks();
    static long loops = 0;
    static GLfloat fps = 0.0f;

    int newTime = SDL_GetTicks();

    if (newTime - lastTime > 100)
    {
        float newFPS = (float)loops / float(newTime - lastTime) * 1000.0f;

        fps = (fps + newFPS) / 2.0f;

        char title[80];
        printf(title, "OpenGL Demo - %2f", fps);


        lastTime = newTime;

        loops = 0;
    }

    loops++;

}

GLvoid drawScene(GLvoid)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glTranslatef(0, 0, -5.0f);
    glRotatef(cubeRotateX, 1, 0, 0);
    glRotatef(cubeRotateY, 0, 1, 0);

    //draw cube
    glBegin(GL_QUADS);
        //top face
        glColor3f(1.0f, 0.5f, 0.0f);
        glVertex3f(1.0f,  1.0f, -1.0f);
        glVertex3f(-1.0f, 1.0f, -1.0f);
        glVertex3f(-1.0f, 1.0f,  1.0f);
        glVertex3f(1.0f,  1.0f,  1.0f);

        //bottom face
        glColor3f(0.0f, 1.0f, 0.0f);
        glVertex3f( 1.0f, -1.0f, -1.0f);
        glVertex3f(-1.0f, -1.0f, -1.0f);
        glVertex3f(-1.0f, -1.0f,  1.0f);
        glVertex3f( 1.0f, -1.0f,  1.0f);

        //front face
        glColor3f(1.0f, 0.0f, 0.0f);
        glVertex3f( 1.0f,  1.0f,  1.0f);
        glVertex3f(-1.0f,  1.0f,  1.0f);
        glVertex3f(-1.0f, -1.0f,  1.0f);
        glVertex3f( 1.0f, -1.0f,  1.0f);

          //back face
        glColor3f(1.0f, 1.0f, 0.0f);
        glVertex3f( 1.0f,  1.0f,  -1.0f);
        glVertex3f(-1.0f,  1.0f,  -1.0f);
        glVertex3f(-1.0f, -1.0f,  -1.0f);
        glVertex3f( 1.0f, -1.0f,  -1.0f);

          //left face
        glColor3f(0.0f, 0.0f, 1.0f);
        glVertex3f(-1.0f,  1.0f,   1.0f);
        glVertex3f(-1.0f,  1.0f,  -1.0f);
        glVertex3f(-1.0f, -1.0f,  -1.0f);
        glVertex3f(-1.0f, -1.0f,   1.0f);

          //right face
        glColor3f(1.0f, 0.0f, 1.0f);
        glVertex3f( 1.0f,  1.0f,  1.0f);
        glVertex3f( 1.0f,  1.0f,  1.0f);
        glVertex3f( 1.0f, -1.0f,  1.0f);
        glVertex3f( 1.0f, -1.0f,  1.0f);
    glEnd();

    glFlush();

    //SDL_GL_SwapBuffers(); here is supposed to replace with SDL_GL_SwapWindow() but if a put the window (screen)

    displayFPS();
}

GLboolean checkKeys(GLvoid)
{
    static long lastTime =  SDL_GetTicks();

    const GLfloat speed = 1.0f;
    const long updateTime = 10;

    if (keys[SDLK_ESCAPE])
        return true;

    long newTime = SDL_GetTicks();

    if (newTime - lastTime > updateTime)
    {
        if(keys[SDLK_LEFT])
        cubeRotateY -= speed;
        if(keys[SDLK_RIGHT])
        cubeRotateY += speed;
        if(keys[SDLK_UP])
        cubeRotateX -= speed;
        if(keys[SDLK_DOWN])
        cubeRotateX += speed;
    }

    return false;

}


int main(int argc, char **argv)
{

    SDL_Window *screen = SDL_CreateWindow("OpenGL test",20, 20, windowWidth, windowHeight, SDL_WINDOW_OPENGL);



    if ( SDL_Init(SDL_INIT_VIDEO) < 0 )
    {
        fprintf(stderr, "Unable to initialize SDL %s", SDL_GetError());
        exit(1);
    }


    if ( SDL_GetWindowSurface(screen))
    {
        fprintf(stderr, "Unable to create openGL scene %s", SDL_GetError());
        exit(2);
    }


    initGL(windowWidth, windowHeight);

    int done = 0;


    while ( !done )
    {
        drawScene();

        SDL_Event event;

        while( SDL_PollEvent(&event) )
        {
            if ( event.type == SDL_QUIT )
                done = 1;

            keys = SDL_GetKeyboardState(NULL);
        }

        if(checkKeys()){
            done = 1;
        }


    }

    SDL_Quit();

    return 1;
}




【问题讨论】:

    标签: c++ sdl


    【解决方案1】:

    我不能调用变量(屏幕),因为它在主函数中

    只需将 screen 作为参数传递给 drawScene 函数:

    GLvoid drawScene(SDL_Window *screen)
    {
        // [...]
    
        SDL_GL_SwapWindow(screen);
    }
    
    int main(int argc, char **argv)
    {
        SDL_Window *screen = SDL_CreateWindow("OpenGL test",20, 20, windowWidth, windowHeight, SDL_WINDOW_OPENGL);
    
        // [...]
    
        while ( !done )
        {
            drawScene(screen);
    
            // [...]
    

    【讨论】:

      猜你喜欢
      • 2016-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-21
      • 2014-09-08
      • 2017-10-06
      • 2021-07-27
      相关资源
      最近更新 更多