1

我正在为一个项目使用 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; 
}
4

1 回答 1

0

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

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

更新

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

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

有关完整工作的 OpenGL 示例,请参阅此内容:

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

于 2012-07-01T20:15:50.473 回答