1

プロジェクトに SDL 1.2 を使用しています。それは問題なくレンダリングされますが、いくつかの小さなピクセル シェーダー効果を実行したいと考えています。このショーのすべての例では、SDL のビデオ サブシステムに OpenGl ドライバーを使用しています。

そこで、ドライバーとして opengl を使用してビデオ サブシステムを開始し、SDL_SetVideoMode() に SDL_OPENGL を使用するように指示します。プログラムを実行すると、SetVideoMode() 呼び出しでクラッシュし始めますが、これは OpenGl を強制しなくても問題なく動作しました)。

戻って、OpenGl を強制せずにプログラムを実行し、SDL_VideoDriverName() をダンプすると、「directx」ドライバーを使用していると表示されます。

私の質問は 2 つの側面があります。opengl ドライバーが気に入らないのは何が問題なのか、ここで問題なく opengl を使用するように SDL を取得するにはどうすればよいですか? または、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 でまったく異なるコードパスがトリガーされます。また、SDL で OpenGL を使用すると、ピクセルへの直接アクセスに SDL サーフェスを使用できなくなります。まだサーフェスに直接アクセスしようとしているため、プログラムがクラッシュする可能性が非常に高くなります。

とにかく、ピクセル シェーダーを使用したい場合は、プレーンな SDL によって提供されるように、ピクセル バッファーへの直接アクセスを使用する必要がなくなりました。その場合、OpenGL を介してすべてを行う必要があります。

アップデート

SDL に指定するパラメータの一部は相互に排他的です。また、SDL_VideoInit に指定されたドライバ名は、OpenGL と一緒に使用すると意味がありません (特定の出力デバイスを選択するために DirectDraw と一緒に使用する場合にのみ関係があります)。

また、すでに呼び出しSDL_Init(SDL_INIT_EVERYTHING)を行っているため、呼び出しSDL_VideoInitは冗長であり、実際には有害である可能性があります。

完全に機能する OpenGL の例については、次を参照してください。

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

于 2012-07-01T20:15:50.473 に答える