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

Posted

技术标签:

【中文标题】更新:Ubuntu SDL SetVideoMode 失败,找不到匹配的 GLX Visual【英文标题】:Update: Ubuntu SDL SetVideoMode Failed, Couldn't Find matching GLX Visual 【发布时间】:2012-07-15 20:31:16 【问题描述】:

我一直在尽我所能追查这个问题,我想我已经找到了罪魁祸首,但我无法解决它。

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

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

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

我还注意到一些有趣的事情。静态库的 Debug 版本是 350 奇数 kb,而程序本身只有 150 kb。在 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;

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

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

编辑:在进一步寻找问题后,我注意到 SDL 给出了这个错误:

Couldn't Find Matching GLX Visual

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

【问题讨论】:

为什么要在if语句中初始化Surface,在if语句之前初始化,然后检查是否有效。 它应该可以正常工作,我按照你说的做了,没有区别,调用 SetVideoMode 后 Surf_Display 为空。 【参考方案1】:
SDL_SetVideoMode(WindowWidth, WindowHeight, 32,SDL_GL_DOUBLEBUFFER | SDL_OPENGL))

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


另外,您指定了大量的 GL 属性。尝试删除所有 SDL_GL_SetAttribute() 调用。如果可行,一次将它们添加回来,以确定您的 GL 实现不喜欢哪一个。

【讨论】:

【参考方案2】:

(我知道这是旧的,但我终于破解了它,它已经困扰我好几个月了。)

删除“SDL_GL_ACCUM*”的所有属性集,如果设置多重采样有效,请删除这些属性集。

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

您可能会发现在窗口模式下和使用某些图形驱动程序时看不到 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);

【讨论】:

以上是关于更新:Ubuntu SDL SetVideoMode 失败,找不到匹配的 GLX Visual的主要内容,如果未能解决你的问题,请参考以下文章

Ubuntu Eclipse SDL编程第一个工程

ubuntu 下SDL 声音无法播放,我的电脑能正常听哥的。 Mix_OpenAudio: No available audio device

CMake 无法找到 SDL2_ttf,我正在尝试以与 SDL2 相同的方式链接它,并且两者都正确安装在 Ubuntu 18.04 上

在 Ubuntu 上的代码块内编译 SDL 和 OpenGL

ubuntu下编译ffmpeg+SDL+ffplay提取motion vector

消失的 SDL 矩形。如何使用新的附加形状更新窗口