よくわかりません。WindowsのOpenGL1.xでフレームバッファオブジェクト拡張機能(FBO)を使用するには、次のうちどれを使用しますか?
wglGetProcAddress("glGenFramebuffers");
// or
wglGetProcAddress("glGenFramebuffersEXT");
異なるハードウェアを使用しているユーザーからのレポートからわかる限り、一部のドライバーは、どちらも、2つのうちの一方、または両方のすべての組み合わせをサポートしています。
どちらを使用するのが適切ですか?一部のドライバーは実際に一方をサポートしていますが、もう一方はサポートしていませんか?見つからない場合は、一方から他方にフォールバックしようとするのは正しいですか?
編集: ATIRadeonカードとその周辺のコードでまだ深刻な問題があります。このコード(www.scirra.com)を使用して商用エディターを起動しました。FBOを使用するために使用するコードの組み合わせに関係なく、ユーザーのいくつかの異なる組み合わせでは、何も表示されない(つまり、何もレンダリングされない)と報告されます。
これは、ARB関数(サフィックスなし)を使用するか、EXTサフィックス関数を使用するかを検出するコードです。これは起動時に実行されます:
gl_extensions = reinterpret_cast<const char*>(glGetString(GL_EXTENSIONS));
gl_vendor = reinterpret_cast<const char*>(glGetString(GL_VENDOR));
gl_renderer = reinterpret_cast<const char*>(glGetString(GL_RENDERER));
gl_version = reinterpret_cast<const char*>(glGetString(GL_VERSION));
gl_shading_language = reinterpret_cast<const char*>(glGetString(GL_SHADING_LANGUAGE_VERSION));
// If OpenGL version >= 3, framebuffer objects are core - enable regardless of extension
// (the flags are initialised to false)
if (atof(gl_version) >= 3.0)
{
support_framebuffer_object = true;
support_framebuffer_via_ext = false;
}
else
{
// Detect framebuffer object support via ARB (for OpenGL version < 3) - also uses non-EXT names
if (strstr(gl_extensions, "ARB_framebuffer_object") != 0)
{
support_framebuffer_object = true;
support_framebuffer_via_ext = false;
}
// Detect framebuffer object support via EXT (for OpenGL version < 3) - uses the EXT names
else if (strstr(gl_extensions, "EXT_framebuffer_object") != 0)
{
support_framebuffer_object = true;
support_framebuffer_via_ext = true;
}
}
その後、起動時に、テクスチャへのレンダリングを見越してFBOを作成します。
// Render-to-texture support: create a frame buffer object (FBO)
if (support_framebuffer_object)
{
// If support is via EXT (OpenGL version < 3), add the EXT suffix; otherwise functions are core (OpenGL version >= 3)
// or ARB without the EXT suffix, so just get the functions on their own.
std::string suffix = (support_framebuffer_via_ext ? "EXT" : "");
glGenFramebuffers = (glGenFramebuffers_t)wglGetProcAddress((std::string("glGenFramebuffers") + suffix).c_str());
glDeleteFramebuffers = (glDeleteFramebuffers_t)wglGetProcAddress((std::string("glDeleteFramebuffers") + suffix).c_str());
glBindFramebuffer = (glBindFramebuffer_t)wglGetProcAddress((std::string("glBindFramebuffer") + suffix).c_str());
glFramebufferTexture2D = (glFramebufferTexture2D_t)wglGetProcAddress((std::string("glFramebufferTexture2D") + suffix).c_str());
glCheckFramebufferStatus = (glCheckFramebufferStatus_t)wglGetProcAddress((std::string("glCheckFramebufferStatus") + suffix).c_str());
glGenerateMipmap = (glGenerateMipmap_t)wglGetProcAddress((std::string("glGenerateMipmap") + suffix).c_str());
// Create a FBO in anticipation of render-to-texture
glGenFramebuffers(1, &fbo);
}
私はこのコードの多くのバリエーションを経験してきましたが、すべての人にそれを機能させることはできません。何もレンダリングされないと報告するユーザーのグループは常に存在します。ATIRadeonHDカードは特に問題があるようです。ドライバーのバグが関係しているかどうかはわかりませんが、上記のコードが誤った仮定をしている可能性が高いと思います。
500 repの報奨金があり、何が問題なのかを知っている人には無料のビジネスライセンスを送ります。(99ポンド相当)
編集2:いくつかの詳細。これが失敗することが知られているカードのリストは次のとおりです。
ATI Mobility Radeon HD 5650
ATI Radeon X1600 Pro
ATI Mobility Radeon HD 4200
テクスチャへのレンダリングは実際には行われません。呼び出しだけで、これらのカードでのレンダリングがglGenFramebuffers
完全に停止するようです。FBOの作成を、テクスチャへのレンダリングが実際に行われる最初の時間まで延期することもできますが、おそらく、レンダリングが再び停止するだけです。
GLEWを使用することはできますが、コードで使用できないのは何ですか?ソースを調べたところ、同様のリストを使用しているようですwglGetProcAddress
。私の場合、メソッドが返されます。そうでない場合はglGenFramebuffers
NULLになり、クラッシュします。何か案は...?