0

GLSL で深度マップのキングを描画しようとしていますが、そのためには少なくとも 1 つの 10 ビット チャネルが必要です。私は GL_R16 または GL_RGBA12 を使用することにしました - それらは最も近いものであり、GL_R16 は GPU メモリのコストが少なくなります (そうなるでしょう.. ですよね?)。

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA12, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);

ここで問題が発生します: GLSL で適切に使用するにはどうすればよいですか? Sampler2D はそれを従来の 8 ビット RGBA に変換します...クランプはどうですか? GLSL では、すべてのコンポーネントの色が [0,1] に正規化されます - 16 ビットでも同じですか? 私が知りたいのは、それを使用する方法だけです。

4

1 に答える 1

5

Sampler2Dはそれを古典的な8ビットRGBAに変換します...

いいえ、そうではありません。Asampler2dはフォーマットを知らないか、気にしません(整数フォーマットでない限り、その場合、未定義の動作が発生します)。それをフロートに変換します; これ以上何もない。

クランプはどうですか?

GL_RGBA16は符号なし正規化形式であるため、クランプは関係ありません。GL_RGBA8が[0、255]を[0、1]に変換するのと同じように、範囲[0、65535]の整数値は[0、1]に変換されます。これは「クランプ」ではありません。これは、OpenGLが実行するためのフォーマットの内容です。より高い精度のフォーマットは、より良い精度を提供するだけです。それらはより大きな数を提供しません。

実際に16ビット整数を整数として取得する場合は、実際に整数を格納する形式を使用する必要があります。GL_RGBA16UIは、16ビットの符号なし整数を格納します。もちろん、それにはOpneGL3.x+ハードウェアが必要です。そして、を使用する必要がありますusampler2d

于 2013-01-10T19:57:10.773 に答える