更新:Ubuntu SDL SetVideoMode失败,无法找到匹配的GLX Visual

时间:2012-07-15 20:31:16

标签: c++ linux opengl sdl

我一直在尽力追踪这个问题,我想我找到了罪魁祸首,但我无法修复它。

基本上我试图在Ubuntu 12.04中运行我的简单游戏引擎。引擎是一个静态库,它链接到使用游戏。所有内容编译(在Ubuntu中)都很好,但是当我运行程序时,它永远不会打开一个窗口并立即关闭。在CodeBlocks中,我收到错误“进程终止状态255”。我相信SetVideoMode在Init代码中的这一行检查时返回null:

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

我认为这是因为我之前忘记在NULL之前添加双等号,在这种情况下应用程序不会终止,只是从不创建窗口,程序显然在系统监视器中运行。

我也注意到一些有趣的东西。静态库的Debug版本是350 kb,程序本身只有150kb。在Windows上,程序总是超过库的大小,这假设库是内置于可执行文件中的。这可能是Linux的工作原理。

这是引擎初始化代码:

#include "Scales.h"
#include "SDL/SDL.h"
#include "GL/gl.h"
#include "GL/glu.h"
#include "SDL/SDL_opengl.h"
#include <iostream>

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_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;
}

所有以“游戏”为前缀的函数调用都是实际程序中的外部函数。上面的代码在引擎库中。

如果您需要更多信息,请询问。

编辑:在进一步追查问题之后,我注意到SDL发出了这个错误:

Couldn't Find Matching GLX Visual

这是什么意思,我该如何解决它?

2 个答案:

答案 0 :(得分:0)

SDL_SetVideoMode(WindowWidth, WindowHeight, 32,SDL_GL_DOUBLEBUFFER | SDL_OPENGL))

SDL_GL_DOUBLEBUFFER绝不是SDL_SetVideoMode()的有效flags参数。


此外,您还指定了大量的GL属性。尝试删除所有SDL_GL_SetAttribute()次来电。如果可以的话,一次一个地添加它们以找出你的GL实现不喜欢哪一个。

答案 1 :(得分:0)

(我知道这已经老了,但我终于破解了它,并且几个月来一直困扰着我。)

删除“SDL_GL_ACCUM *”的所有属性集,删除这些属性集应该设置多重样本。

还要记得启用GL_MULTISAMPLE,GL_LINE_SMOOTH和GL_POLYGON_SMOOTH,并且可能提供线/多边形平滑的提示。

在窗口模式和某些图形驱动程序(我的催化剂驱动程序似乎没有做任何事情)时,您可能会发现AA没有看到AA的效果。

这些是我使用的属性:

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, 24);
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_ACCELERATED_VISUAL, 1);

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