2011-08-02 34 views
6

私は混乱しています。 、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になり、クラッシュします。何か案は...?

+0

私はここの恩恵を得るために見ていないんだけど、あなたはGLEWに興味があるかもしれない(http://stackoverflow.com/questions/17370/using-glew-to-use-opengl-extensions - アンダーウインドウ)。それは私のためにいくつかのプロジェクトで複数のプラットフォーム間で拡張機能を管理することの苦労を緩和するのに役立ち、wglGetProcAddressを手動で呼び出すことを強く推奨します。 – Flexo

+2

具体的に間違っていたことを教えてくれたら本当に役に立ちます。 FBOをどのように使っているのか、ATIカードに問題があるのか​​などあなたの顧客からの遠隔報告はありますか?おそらくFBOの種類がサポートされているかどうか、フレームバッファが完成したかどうかなど、いくつかのログが記録されます。 –

+0

新しいウィンドウフレームバッファーを作成した後にウィンドウフレームバッファーをアクティブ化しようとしましたか?実装によっては、すぐにそれに切り替えるかもしれません。 –

答えて

8

拡張子がGL_EXT_framebuffer_objectの場合は、wglGetProcAddress("glGenFramebuffersEXT");を使用できます。

OpenGLバージョンが3.0以上(このバージョンではFBO拡張モジュールがコアに追加されている)の場合、wglGetProcAddress("glGenFramebuffers");を使用できます。

+0

ありがとうございます。 OpenGLバージョンが3以上の場合、 'wglGetProcAddress(" glGenFramebuffersEXT ")'はまだ動作していますか、それとも削除されていますか? – AshleysBrain

+0

@AshleysBrain:ドライバメーカーに依存すると思いますが、それについてはわかりません。多分誰かがジャンプすることができます:-) – Tobi

+0

ああ、私はそれは問題ではないと思います。 OpenGLバージョン> = 3の場合、非EXTバージョンをリクエストします。ありがとう! – AshleysBrain

3

含まれているコードは問題ではありません。もちろん、あなたがすでに行っているように、拘束ポイントが得られるはずです。

ARB_framebuffer_objectがサポートされている場合は、EXTの接尾辞なしのエントリポイントが使用されます。 EXT_framebuffer_objectがサポートされている場合は、EXT接尾辞のエントリポイントが使用されます。どちらもサポートされている場合は、正しいバインディングポイントを取得して実装を選択できます。

私はこの問題に非常に関心があります(私にはa similar doubtがいるので)。

あなたはEXT仕様にARB仕様を比較した場合、あなたは違いの多くを気づくことができます。

ここでは、このトピックに関する最も興味深いARBの仕様の段落を引用します。

仕様は非常に長いですが、ARBバリアントはEXT互換性の問題について多くの議論が含まれています。あなたはアプリケーションを実行しているので、エントリポイントはおそらく正しいでしょうし、エラーは(Nicolas Bolasの示唆しているように)フレームバッファの完全性にある可能性があります。

ごとの紹介が可能チェックし、二回(心の中でARBスペックを取って1、心の中でEXTスペックを取って1)の実装をダブルチェック。この拡張を行いどのような追加機能


EXT_framebuffer_object の上に含めますか?

Currently we incorporate the following layered extensions: 

    * EXT_framebuffer_multisample 
    * EXT_framebuffer_blit 
    * EXT_packed_depth_stencil 

としてだけでなく、次の機能:

 * Permit attachments with different width and height (mixed 
     dimensions) 

    * Permit color attachments with different formats (mixed 
     formats). 

    * Render to 1 and 2 component R/RG formats that are provided 
     via the ARB_texture_rg extension. L/A/LA/I will be 
     left for a separate (trivial) extension. 

    * Gen'ed names must be used for framebuffer objects and 
     renderbuffers. 

    * Added FramebufferTextureLayer. 
    ... 

EXT_framebuffer_objectから他の違いは何ですか。

 * Framebuffer completeness only considers the attachments named 
     by DRAW_BUFFERi and READ_BUFFER. Any other attachments do 
     not affect framebuffer completeness. (In 
     EXT_framebuffer_object, all attachments affected framebuffer 
     completeness, independent of the DRAW_BUFFERi and READ_BUFFER 
     state.) 
    * Added new queries for the sizes of the bit planes for color, 
     depth and stencil attachments at a framebuffer attachment point. 
    * Added new queries for framebuffer attachment component type and 
     color encoding. 
    * Many other minor tweaks to synchronize with the GL3 framebuffer 
     objects. 
    * ARB FBOs are not shareable. 

この拡張とEXT_framebuffer_object両方持っている機能(BindFramebufferとBindFramebufferEXT) " フレームバッファをバインドします"。 では、2つの機能の間に機能に違いはありますか?

RESOLVED: Yes. Both extensions will create a new framebuffer object 
    if called with an unused name. However, BindFramebuffer defined in 
    this extension will generate an INVALID_OPERATION error if the name 
    provided has not been generated by GenFramebuffer. That error did 
    not exist in EXT_framebuffer_object, and this extension does not 
    modify the behavior of BindFramebufferEXT. This difference also 
    applies to BindRenderbuffer from this extension vs. 
    BindRenderbufferEXT from EXT_framebuffer_object. 
関連する問題