OpenGL SDL屏幕故障

C++ OpenGL SDL Screen Trouble

本文关键字:故障 屏幕 SDL OpenGL      更新时间:2023-10-16

我又回来了,可能是一个小问题,我似乎无法在进行我的OpenGL/SDL冒险时解决。

这个程序带来了一个640x480px的SDL屏幕,但是里面什么也没有,甚至没有背景,它只是透明的通过它后面的屏幕上的任何东西,我不得不承认,我不确定为什么,尽管这可能是另一个愚蠢的错误。

#include <SDL/SDL.h>
#include <SDL/SDL_opengl.h>
SDL_Event event;
int main (int argc, char **argv)
{
bool quit = false;
init();
draw_square(0,0,0);
while (quit == false)
    {
        if( event.type == SDL_QUIT )
            {
                quit = true;
            }
    }
SDL_Quit();
return 0;
}
void init ()
{
SDL_Init(SDL_INIT_EVERYTHING);
SDL_SetVideoMode(640,480,32,SDL_OPENGL);
SDL_WM_SetCaption( "OpenGL Test", NULL );
glClearColor( 0, 0, 0, 0 );
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glOrtho( 0, 0 , 640 , 480, 0, 1 );
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
}
void draw_square (int x, int y, int z)
{
glTranslatef(x,y,z);
glColor4f(1.0,1.0,1.0,1.0);
glBegin(GL_QUADS);
    glVertex3f(0, 0 ,0);
    glVertex3f(50,0 ,0);
    glVertex3f(50,50,0);
    glVertex3f(0, 50,0);
glEnd();
glPushMatrix();
}

非常感谢~ Michael

尽管设置了透明颜色,但您不会清除屏幕。你需要一个像glClear(GL_COLOR_BUFFER_BIT)这样的调用;实际执行清理。

此外,如果你想做静态绘制以外的任何事情,最好在循环内部持续渲染…很可能你什么都看不到,因为它希望你做双缓冲绘图,并需要你交换缓冲区,以看到屏幕上的结果。通常,这是在所有draw调用完成后的每次循环中完成的。我相信你可以用SDL_GL_SwapBuffers

在调用glClearColor时为alpha传递0。试着"1"。

使整个屏幕透明。但我没想到这真的管用,很高兴知道了。:)

#include <SDL/SDL.h>
#include <SDL/SDL_opengl.h>
SDL_Event event;
int main (int argc, char **argv)
{
    bool quit = false;

你应该在这里调用SDL_Init,而不是将它委托给某个init函数。否则,当init被调用时,某些人(你?)可能会改变,从而破坏你的程序。实际上,主函数就是init函数。窗口创建应该在一个叫做create_window或类似的函数中进行。

    init();

从技术上讲,调用draw_square或事件循环之外的任何绘图函数都会带来麻烦。您看到的效果是:如果您的窗口暴露(最初显示),那么就会发生这种情况,但是通知程序需要更新内容的任何事件(因为它们被覆盖了)都没有效果。始终从事件循环中调用绘图函数。对于响应绘制事件的静态绘制,对于空闲部分中的动画场景。

    draw_square(0,0,0);
    while (quit == false) {
        if( event.type == SDL_QUIT ) {
            quit = true;
        }
    }
    SDL_Quit();
    return 0;
}
void init ()    
{
    SDL_Init(SDL_INIT_EVERYTHING);
    SDL_SetVideoMode(640,480,32,SDL_OPENGL);
    SDL_WM_SetCaption( "OpenGL Test", NULL );
这是最常见的新手误解,认为OpenGL是"初始化的"。以下调用意味着在场景设置时调用,即在绘图函数开始时调用。

你还缺:

  • 设置视口
  • 实际清除场景(glClearColor只告诉在实际清除调用时要清除到哪个颜色;从技术上讲,它只是设置一些"寄存器",但不执行)。

所以这里不应该叫

    glClearColor( 0, 0, 0, 0 );
    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
    glOrtho( 0, 0 , 640 , 480, 0, 1 );
    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity();
}
void draw_square (int x, int y, int z) {
    glTranslatef(x,y,z);
    glColor4f(1.0,1.0,1.0,1.0);
    glBegin(GL_QUADS);
        glVertex3f(0, 0 ,0);
        glVertex3f(50,0 ,0);
        glVertex3f(50,50,0);
        glVertex3f(0, 50,0);
    glEnd();

下一行是一个大大的WTF?!

    glPushMatrix();

每个矩阵堆栈push必须与pop操作(glPopMatrix)平衡。然而,推入矩阵只有在它后面有一些变换时才有意义。事实并非如此。如果你在循环中调用draw_square,你会在32到128次迭代中耗尽最大矩阵堆栈深度(更可能是在较低的数字上)。

}