2

次のような問題があるとします。現在、フレーム バッファがあり、テクスチャには 1 つのカラー コンポーネント (GL_RED など) しか含まれておらず、既にバインドされています。フラグメントシェーダーはどのように見えますか? 答えは次のとおりだと思います。

... out float ex_color;

ex_color = ...;

ここで質問があります。シェーダーはフレームバッファーのフォーマットを自動的に検出し、それに値を書き込みますか? フラグメント シェーダが float 値を出力するが、フレームバッファ フォーマットが GL_RGBA の場合はどうなりますか?

ところで、コンポーネントが 1 つだけのテクスチャを作成する正しいアプローチは何ですか? 次のようなサンプルを含む g-truc から例を読みました。

glTexImage2D(GL_TEXTURE_2D, 0, GL_RED,GLsizei(Texture.dimensions().x), GLsizei(Texture.dimensions().y), 0,GL_RGB, GL_UNSIGNED_BYTE, 0);

GL_RGB をピクセル データ形式として割り当てるとはどういう意味ですか?

4

2 に答える 2

6

頂点シェーダーの入力がglVertexAttribPointerで指定されたデータの正確なサイズと一致する必要がないのと同様に、フラグメント シェーダーの出力は、書き込まれる画像の正確なサイズと一致する必要はありません。出力が宛先イメージ形式よりも多くのコンポーネントを提供する場合、余分なコンポーネントは無視されます。より少ない値を提供する場合、他のコンポーネントは未定義の値を持ちます (未指定の値が明確に定義された値を持つ頂点入力とは異なります)。

GL_RGB をピクセル データ形式として割り当てるとはどういう意味ですか?

それがピクセル転送フォーマットです。これは、OpenGL がピクセルを保存する形式ではなく、OpenGL に提供するピクセルの形式を表します。

のようなサイズのないものではなく、常にサイズ設定された内部フォーマットGL_REDを使用する必要があります。

于 2013-07-30T17:51:35.410 に答える
3

内部形式と形式の適切な説明については、以下を参照してください。

http://opengl.org/wiki/Image_Formatおよびhttp://opengl.org/sdk/docs/man/xhtml/glTexImage2D.xml

基本的に、フォーマットには GL_RED が必要であり、内部フォーマットには GL_R8 (符号なしで正規化された 8 ビット固定小数点) が必要になる可能性があります。

昔は、輝度テクスチャがシングル チャンネルの標準でしたが、これは最新の GL では非推奨の形式であり、赤/緑が最も論理的な形式であるのと同様に、赤はシングル チャンネルの論理的な「描画可能な」テクスチャ形式になりました。 2チャンネル用。

シェーダーに関しては、コア仕様で定義されたコンポーネント展開のルールがあります。入力として 1 チャンネルのテクスチャがあるが、それを vec4 としてサンプリングする場合、vec4 (RED, 0.0, 0.0, 1.0) と同等になります。

テクスチャへの書き込みは少し異なります。

OpenGL 4.4 Spec、セクション 15.2 (Shader Execution)、pp. 441 から -- http://www.opengl.org/registry/doc/glspec44.core.pdf

When a fragment shader terminates, the value of each active user-defined output variable is written to components of the fragment color output to which it is bound. The set of fragment color components written is determined according to the variable’s data type and component index binding, using the mappings in table 11.1 [pp. 341].

デフォルトでは、フラグメント シェーダーの出力が float の場合、テクスチャの x (赤) コンポーネントに書き込みます。レイアウト修飾子 (例: layout (component=1) out float color; ) を使用して、y (緑)、z (青)、または w (アルファ) に書き込むように指定できます (RGBA テクスチャがある場合)。

于 2013-07-30T17:47:14.543 に答える