我正在将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;
}
答案 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示例,请参阅此内容: