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

时间:2012-07-01 19:12:55

标签: opengl directx sdl

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

因此,我以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; 
}

1 个答案:

答案 0 :(得分:0)

没有OpenGL选项的SDL使用DirectX来直接访问3D绘图表面。使用OpenGL在SDL中触发完全不同的代码路径。使用带有SDL的OpenGL,您不再能够使用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