私は混乱しています。 、Windows上でのOpenGL 1.1にフレームバッファオブジェクトの拡張機能(FBO)を使用するには、私はglGenFramebuffersまたはglGenFramebuffersEXT?
wglGetProcAddress("glGenFramebuffers");
// or
wglGetProcAddress("glGenFramebuffersEXT");
?:使用しない限り、私は別のハードウェアを持つユーザーからのレポートから言うことができるように、いくつかのドライバは、すべてのサポートこれらのどの両方のうちの1つ、または両方の組み合わせである。
どちらが正しいですか?いくつかのドライバーは実際には1つをサポートしますが、他のドライバーはサポートしませ見つからない場合は、一方から他方に転倒しようとするのは正しいですか?
編集:私はまだATIのRadeonカードとこの周りのコードで深刻な問題を抱えています。このコード(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);
}
私はこのコードの多くのバリエーションをしてきた、と私は単純に取得することはできませんみんなのために働くこと。レンダリングを何も報告しないユーザーのグループは、常にあります。 ATI Radeon HDカードは特に問題があるようです。ドライバのバグがあるかどうかは分かりませんが、上記のコードが誤った仮定をしている可能性が高いと思います。
500 rep bountyと私は間違ったことを知っている人に無料のビジネスライセンスを送ります! (値£99)
編集2:もう少し詳細。ここでは、これは上で失敗することが知られていることをカードのリストは以下のとおりです。
のATI MobilityのRadeon HD 5650
ATIのRadeon X1600 Proを
のATI Mobility RadeonのテクスチャへのHD 4200
ませレンダリングが実際にあります完了しました。 glGenFramebuffers
コールだけでは、これらのカードで完全にレンダリングが停止するようです。レンダリングとテクスチャの実際の作業が初めて行われるまでFBOの作成を延期することができますが、レンダリングをもう一度やめさせることになるでしょう。
私はGLEWを使うことができましたが、私のコードは何をしていますか?私はソースを見て、それはwglGetProcAddress
の同様のリストを使用するようだ。私の場合、メソッドが返されています。そうでないとglGenFramebuffers
はNULLになり、クラッシュします。何か案は...?
私はここの恩恵を得るために見ていないんだけど、あなたはGLEWに興味があるかもしれない(http://stackoverflow.com/questions/17370/using-glew-to-use-opengl-extensions - アンダーウインドウ)。それは私のためにいくつかのプロジェクトで複数のプラットフォーム間で拡張機能を管理することの苦労を緩和するのに役立ち、wglGetProcAddressを手動で呼び出すことを強く推奨します。 – Flexo
具体的に間違っていたことを教えてくれたら本当に役に立ちます。 FBOをどのように使っているのか、ATIカードに問題があるのかなどあなたの顧客からの遠隔報告はありますか?おそらくFBOの種類がサポートされているかどうか、フレームバッファが完成したかどうかなど、いくつかのログが記録されます。 –
新しいウィンドウフレームバッファーを作成した後にウィンドウフレームバッファーをアクティブ化しようとしましたか?実装によっては、すぐにそれに切り替えるかもしれません。 –