あなたは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_WIDTH
GL_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
、テクスチャをその自然な内部ターゲットにバインドするを提供します。
テクスチャをバインドし、それがミップマップレベルになったら、を使用glGetTexLevelParameter
GL_TEXTURE_WIDTH
してそのレベルのとをクエリしGL_TEXTURE_HEIGHT
ます。
さて、それは簡単な問題です。難しい問題はあなたのタイトルが尋ねるものです:
フレームバッファオブジェクトのサイズ(幅、高さ)を確認したい。
FBOのレンダリング可能な領域のサイズは、のサイズと同じではありませんGL_COLOR_ATTACHMENT0
。FBOのレンダリング可能な領域は、FBOに添付されているすべての画像のすべてのサイズの共通部分です。
このFBOに関する特別な知識がない限り、FBOに含まれる画像が1つだけである、またはすべての画像が同じサイズであると想定することはできません(FBOに関する特別な知識がある場合は、率直に言って、特別な画像も必要です。それがどれほど大きいかについての知識)。したがって、添付ファイルごとに上記の手順を繰り返す必要があります(タイプがの場合GL_NONE
、何も添付されません)。次に、戻り値の交点を取ります(つまり、最小の幅と高さ)。
一般に、作成したFBOにその大きさを尋ねる必要はありません。テクスチャの大きさを尋ねる必要がないのと同じように。あなたはそれらを作りました。定義上、あなたはそれらがどれほど大きいかを知っています。あなたはそれらをFBOに入れるので、あなたはそれがどれほど大きいかを再び知っています。