4

フレームバッファ オブジェクトのサイズ (幅、高さ) を決定したいと考えています。

経由でフレームバッファオブジェクトを作成しました

// create the FBO. 
glGenFramebuffers(1, &fboId);

フレームバッファ オブジェクト ID ( ) のみを指定して、最初のカラー アタッチメントのサイズを取得するにはどうすればよいfboIdですか? これは可能ですか、それともカラー アタッチメントのサイズを外部変数に格納して、後で FBO のサイズを知る必要がありますか?

4

1 に答える 1

19

あなたは2つの異なることを求めているので、あなたの質問はやや混乱しています。

簡単な質問は次のとおりです。

フレームバッファオブジェクトID(fboId)のみを指定して、最初のカラー添付ファイルのサイズを取得するにはどうすればよいですか?

それは簡単です。その添付ファイルにアタッチされたtexture/renderbufferを取得し、アタッチされているミップマップレベルと配列レイヤーを取得してから、texture/renderbufferにその大きさを問い合わせます。

最初の2つのステップはglGetFramebufferAttachmentParameter(キーワード「添付ファイル」に注意)を使用して実行されGL_COLOR_ATTACHMENT0ます。をクエリして、GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPEそれがレンダーバッファかテクスチャかを取得します。でrenderbuffer/texture名を取得できますGL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME

オブジェクトがrenderbufferの場合は、renderbufferをバインドし、を使用してrenderbufferとをglGetRenderbufferParameterフェッチできます。GL_RENDERBUFFER_WIDTHGL_RENDERBUFFER_HEIGHT

オブジェクトがテクスチャの場合は、さらに作業を行う必要があります。GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVELミップマップレベルを取得するには、添付ファイルパラメータをクエリする必要があります。

もちろん、今度はそれをバインドする方法を知る必要があります。4.4より前のバージョンまたは特定の拡張機能のないOpenGLバージョンを使用している場合、これは複雑です。を参照してください。使用するテクスチャターゲットタイプを知る必要があります。これは愚かで面倒に思えるかもしれませんが、テクスチャオブジェクト名だけからターゲットを決定する唯一の方法は...すべてを試すことです。各ターゲットを調べて確認しglGetErrorます。返されGL_INVALID_OPERATION ないものが正しいものです。

GL 4.4またはARB_multi_bindを使用できる場合は、ターゲットを指定する必要がない(「s」に注意)だけを使用できます。glBindTexturesまた、4.5またはARB_direct_state_accessを使用している場合は、テクスチャをバインドする必要はまったくありません。DSAスタイルの関数は、テクスチャターゲットを必要としません。またglBindTextureUnit、テクスチャをその自然な内部ターゲットにバインドするを提供します。

テクスチャをバインドし、それがミップマップレベルになったら、を使用glGetTexLevelParameterGL_TEXTURE_WIDTHしてそのレベルのとをクエリしGL_TEXTURE_HEIGHTます。

さて、それは簡単な問題です。難しい問題はあなたのタイトルが尋ねるものです:

フレームバッファオブジェクトのサイズ(幅、高さ)を確認したい。

FBOのレンダリング可能な領域のサイズは、のサイズと同じではありませんGL_COLOR_ATTACHMENT0。FBOのレンダリング可能な領域は、FBOに添付されているすべての画像のすべてのサイズの共通部分です。

このFBOに関する特別な知識がない限り、FBOに含まれる画像が1つだけである、またはすべての画像が同じサイズであると想定することはできません(FBOに関する特別な知識がある場合は、率直に言って、特別な画像も必要ですそれがどれほど大きいかについての知識)。したがって、添付ファイルごとに上記の手順を繰り返す必要があります(タイプがの場合GL_NONE、何も添付されません)。次に、戻り値の交点を取ります(つまり、最小の幅と高さ)。

一般に、作成したFBOにその大きさを尋ねる必要はありません。テクスチャの大きさを尋ねる必要がないのと同じように。あなたはそれらを作りました。定義上、あなたはそれらがどれほど大きいかを知っています。あなたはそれらをFBOに入れるので、あなたはそれがどれほど大きいかを再び知っています。

于 2013-03-03T13:53:38.810 に答える