SDL+OpenGL 程序没有出现在 linux 上

Posted

技术标签:

【中文标题】SDL+OpenGL 程序没有出现在 linux 上【英文标题】:SDL+OpenGL program not appearing on linux 【发布时间】:2012-07-10 21:03:01 【问题描述】:

我开始在 Windows 上使用 SDL 和 OpenGL 制作这个超级简单的游戏引擎。引擎位于静态库中,到目前为止,它所做的只是显示一个蓝色窗口,其中包含引擎的所有基础工作。

它在 Windows 上运行良好,但后来我将它移植到 Linux 上,什么也没有。该程序运行良好并显示在系统监视器中,但没有出现任何窗口。我安装了几个 mesa 和 gl 库来检查是不是这样。现在它不会运行并说进程以状态 -1 终止。

这是引擎中的初始化代码。其他的请询问。

#include "Scales.h"
#include "SDL/SDL.h"
#include "gl.h"
#include "glu.h"

Engine *scalesEngine;

bool OnInit(int WindowHeight, int WindowWidth)

    SDL_Surface* Surf_Display;

    if(SDL_Init(SDL_INIT_EVERYTHING) < 0) 
        return false;
   
    SDL_GL_SetAttribute(SDL_GL_RED_SIZE,        8);
    SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE,      8);
    SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE,       8);
    SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE,      8);

    SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE,      16);
    SDL_GL_SetAttribute(SDL_GL_BUFFER_SIZE,        32);

    SDL_GL_SetAttribute(SDL_GL_ACCUM_RED_SIZE,    8);
    SDL_GL_SetAttribute(SDL_GL_ACCUM_GREEN_SIZE,    8);
    SDL_GL_SetAttribute(SDL_GL_ACCUM_BLUE_SIZE,    8);
    SDL_GL_SetAttribute(SDL_GL_ACCUM_ALPHA_SIZE,    8);

    SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS,  1);
    SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES,  2);

   if((Surf_Display = SDL_SetVideoMode(WindowWidth, WindowHeight, 32, SDL_HWSURFACE | SDL_GL_DOUBLEBUFFER | SDL_OPENGL)) = NULL)
        return false;
   

   glClearColor(0.422f,0.576f,1.0f,1.0f);
   glClearDepth(1.0f);

   glViewport(0, 0, WindowWidth, WindowHeight);

   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();

   glOrtho(0, WindowWidth, WindowHeight, 0, 1, -1);

   glMatrixMode(GL_MODELVIEW);

   glEnable(GL_TEXTURE_2D);

   glLoadIdentity();

   game_Init();

   return true;


int main(int argc, char* argv[])

    scalesEngine = new Engine;

    game_preload();

    if(OnInit(scalesEngine->WindowHeight(), scalesEngine->WindowWidth()) == false)
        return -1;
    

    SDL_Event Event;

    //Main Game Loop
    while(scalesEngine->Running)

        while(SDL_PollEvent(&Event))
            scalesEngine->OnEvent(&Event);
        


        scalesEngine->Update();
        scalesEngine->Render();
    

    scalesEngine->OnCleanUp();
    delete scalesEngine;

    return 0;

【问题讨论】:

【参考方案1】:
if((Surf_Display = SDL_SetVideoMode(WindowWidth, WindowHeight, 32, SDL_HWSURFACE | SDL_GL_DOUBLEBUFFER | SDL_OPENGL)) = NULL)
    return false;

我很确定你的意思是== NULL,对吧?

【讨论】:

【参考方案2】:

如果你没有得到一个窗口,我怀疑你没有得到你的硬件上下文。尝试使用SDL_SWSURFACE 而不是SDL_HWSURFACE

SDL_SetVideoMode(... SDL_SWSURFACE ...

我在虚拟机中开发时看到过这种情况,但我确信还有其他原因。

编辑:

正如 cmets 中所指出的,这两个表面标志以及 SDL_OPENGL 无论如何都可能是多余的。

【讨论】:

我会完全放弃这个标志。在制作 OpenGL 上下文而不是原始绘图表面时,您无需担心该表面标志。 其实SDL_HWSURFACE、SDL_SWSURFACE和SDL_OPENGL是互斥的。您只能选择其中之一。 @datenwolf:这在某处有记录吗? @datenwolf 我隐约记得在不同平台上使用 SDL_OPENGL 标志和这两个选项。我相信它只是没有被强制执行或被忽视,尽管我在网上找不到证据。 @TomKerr:这些标志实际上只有在您想直接访问“哑”帧缓冲区时才有意义,该缓冲区可以通过写入和读取的内存来访问。这称为表面。 OpenGL 操作不涉及此类帧缓冲区访问,并且可能根本不受 OpenGL 实现的支持。请记住,SDL 在没有 OpenGL 支持的情况下启动。这是后来才添加的。

以上是关于SDL+OpenGL 程序没有出现在 linux 上的主要内容,如果未能解决你的问题,请参考以下文章

SDL/C++ OpenGL 程序,如何阻止 SDL 捕获 SIGINT

神秘的 OpenGL/SDL 内存增长

C++ OpenGL SDL 屏幕问题

SDL2:如何同时拥有 SDL2 菜单和 OpenGL 上下文?

使用 OpenGL 和 SDL 处理窗口大小调整

Linux 上的 SDL OpenGL 新手,这有啥问题?