【问题标题】:SDL Won't Use OpenGL driver, defaults to DirectXSDL 不使用 OpenGL 驱动程序,默认为 DirectX
【发布时间】:2012-07-02 08:23:28
【问题描述】:

我正在为一个项目使用 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 directx sdl


    【解决方案1】:

    不带 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

    【讨论】:

    • 程序崩溃只是试图在 OpenGL 上运行启动,我实际上还没有尝试绘制任何东西。我已经用代码更新了我的帖子,当运行任何 openGl 代码时都会崩溃。如果我删除带有“Crashes here”注释的行,那么它会在视频模式创建步骤中失败。
    • 我明白了。更改一些参数后,我的程序再次运行。 OpenGL 示例运行良好,但有趣的是 SDL_VideoDriverName() 仍然返回驱动程序是 directx。我认为我的问题是过于专注于做出改变。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-17
    • 1970-01-01
    • 2021-10-13
    • 2010-10-25
    相关资源
    最近更新 更多