SDL 不会使用 OpenGL 驱动程序,默认为 DirectX



我正在将 SDL 1.2 用于项目。 它渲染得很好,但我想做一些小的像素着色器效果。 此的所有示例都显示了对 SDL 视频子系统使用 OpenGl 驱动程序。

因此,我以 opengl 作为驱动程序启动视频子系统,并告诉 SDL_SetVideoMode() 使用SDL_OPENGL。 当我去运行程序时,它现在开始在 SetVideoMode() 调用上崩溃,该调用在没有强制 OpenGl 的情况下工作正常)。

我回去运行程序而不强制OpenGl并转储出SDL_VideoDriverName(),它说我正在使用"directx"驱动程序。

我的问题是双管齐下的:它不喜欢 opengl 驱动程序有什么问题,我如何让 SDL 在这里毫无问题地使用 opengl?或者,如何将 SDL 图面放入 DirectX 以应用像素着色器效果?

我更喜欢使用 OpenGl,因为它更容易将代码移植到其他平台。

例如,我添加了以下代码,当我尝试使用 OpenGl 系统时会中断:

#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <SDL.h>
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT )
{
    SDL_putenv("SDL_VIDEODRIVER=opengl");
    SDL_Init( SDL_INIT_EVERYTHING );
    SDL_VideoInit("opengl",0);
    SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 );  // crashes here
    SDL_Surface *mWindow = SDL_SetVideoMode(1024,768,32,SDL_HWSURFACE|SDL_HWPALETTE|SDL_DOUBLEBUF|SDL_OPENGL);
    SDL_Quit();
    return 0; 
}

没有 OpenGL 选项的 SDL 使用 DirectX 直接访问 3D 绘图图面。使用 OpenGL 会在 SDL 中触发完全不同的代码路径。将 OpenGL 与 SDL 结合使用,您不能再使用 SDL 表面直接访问像素 您的程序很可能崩溃了,因为您仍在尝试直接访问该表面。

无论如何,如果要使用像素着色器,则不再需要使用普通 SDL 提供的直接像素缓冲区访问。然后你必须通过OpenGL做所有事情。

更新

您提供给 SDL 的某些参数是互斥的。此外,如果与 OpenGL 一起使用,则提供给SDL_VideoInit的驱动程序名称毫无意义(它仅与 DirectDraw 一起选择特定的输出设备)。

另外,因为您已经SDL_Init(SDL_INIT_EVERYTHING)调用SDL_VideoInit是多余的,实际上可能是有害的。

有关一个完全工作的 OpenGL 示例,请参阅此处:

http://sdl.beuc.net/sdl.wiki/Using_OpenGL_With_SDL

最新更新