web-dev-qa-db-ja.com

浮動小数点テクスチャとは正確には何ですか?

OpenGL ARB_texture_float仕様を読んでみましたが、それでも頭の中で理解できません。

また、浮動小数点データは、テクスチャにロードしている画像の通常の8ビット/チャネルRGBAまたはRGBデータとどのように関連していますか?

17
lokstok

ここに少し読んでください ここ それについて。

基本的に浮動小数点テクスチャは、データが浮動小数点タイプであるテクスチャです:)つまり、クランプされていません。したがって、テクスチャに3.14fがある場合、シェーダーで同じ値を読み取ります。

異なるチャンネル数で作成できます。また、フォーマットに応じて、16ビットまたは32ビットのテクスチャを作成することもできます。例えば.

// create 32bit 4 component texture, each component has type float    
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, 16, 16, 0, GL_RGBA, GL_FLOAT, data);

データは次のようになります。

float data[16][16];
for(int i=0;i<16*16;++i) data[i] = sin(i*M_PI/180.0f); // whatever

次に、シェーダーでまったく同じ(FLOAT32テクスチャを使用する場合)値を取得できます。

例えば.

uniform sampler2D myFloatTex;
float value = texture2D(myFloatTex, texcoord.xy);

GL_RGBA16Fなどの16ビット形式を使用していた場合、シェーダーで読み取るたびに変換が行われます。したがって、これを回避するには、half4タイプを使用できます。half4value= texture2D(my16BitTex、texcoord.xy);

したがって、基本的に、正規化された8ビットテクスチャと浮動小数点テクスチャの違いは、前者の場合、値が[0..1]の範囲になり、クランプされるのに対し、後者の場合、値をそのまま受け取ることです(16 <を除く)。 -> 32変換、上記の私の例を参照)。

FBOでレンダリングターゲットとして使用したいというわけではありません。この場合、すべてのフォーマットがレンダリングターゲットとしてアタッチされているわけではないことを知っておく必要があります。例えば。輝度と強度のフォーマットを添付することはできません。

また、すべてのハードウェアが浮動小数点テクスチャのフィルタリングをサポートしているわけではないため、必要に応じて、最初にケースを確認する必要があります。

お役に立てれば。

18
alariq

FPテクスチャには、特別に指定された範囲の内部フォーマット(RGBA_16F、RGBA_32Fなど)があります。通常のテクスチャは固定小数点データを格納するため、テクスチャから読み取ると[0,1]の範囲値が得られます。逆に、FPテクスチャは結果として[-inf、+ inf]の範囲を提供します(必ずしもより高い精度である必要はありません)。

多くの場合(HDRレンダリングなど)、値を[0,1]の範囲に収まるように変換するだけで、FPテクスチャなしで簡単に進めることができます。ただし、遅延レンダリングのような場合もあります。たとえば、範囲を気にせずに世界空間の座標を保存したい。

4
kvark