正と負の値をテクスチャに保存するにはどうすればよいですか?

Dec 03 2020

GPUを使用して(フラグメントシェーダーを介して)計算を行い、署名された値をテクスチャ内に格納する必要があるプログラムを作成しています。

私のテクスチャは次のようにGL_FLOATで初期化されます。

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_FLOAT, nullptr);

そして、openglについて私が理解していることから、GL_FLOATを使用する場合、個々のテクセルは[0,1]の範囲内にある必要があります(glClearを試したとき、値はこの範囲にクリップされます)。つまり、これまで行ってきたのは、実際の範囲に基づいて値を[-1,1]の範囲に縮小し、それを[0,1]に変換してから、テクスチャに書き戻すことです。データを処理する必要がある次のシェーダーは、テセル値を読み取り、続行する前に[-1,1]に移動します。

私の質問は、これは負の値を処理する正しい方法ですか?変換を繰り返すとfpエラーが蓄積するのは間違いありませんが、これは明らかに精度には良くありません。

ありがとうございました

回答

1 httpdigest Dec 03 2020 at 15:04

参照:フォーマットと内部フォーマットの違い

内部フォーマット(の第三のパラメータはglTexImage2D)決定する方法GPUストアと解釈これらの値ではなく、のパラメータglTexImage2D(最後から2番目のパラメータ)。このパラメーターは、テクスチャにアップロードするときにドライバーがクライアント/ホスト側のメモリをどのように解釈するかを決定します。これは、現在、を使用して使用していませんnullptr

テクスチャには、符号付き8ビットGL_RGBA8_SNORMまたは16ビット浮動小数点GL_RGBA16Fまたは32ビット浮動小数点GL_RGBA32Fサイズの内部形式を使用できます。

一般に、必要なものと取得するものを明示するために、常にサイズ設定された内部形式を使用する必要があります。

次の表を参照してください。 https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glTexImage2D.xhtml

したがって、8ビットの解像度と、[-1、1]の範囲の値のみが必要な場合は、次を使用できます。

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8_SNORM, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);

テキセルデータをテクスチャにアップロードしていないため、最後から2番目の引数は実際には関係ありません。