6

プログラムを頂点位置のGLfloatからGLshortに変換しようとしていますが、シェーダーでこれを表現する方法がわかりません。シェーダーでvec3データ型を使用していましたが、vec3は3つのfloatを表します。今、私は3つのショートパンツを表す必要があります。私が知る限り、OpenGLにはショートパンツのベクトルがないので、この場合はどうすればよいですか?

4

1 に答える 1

16

シェーダーでこれを表現する方法がわかりません。

これは、この情報がシェーダーに存在しないためです。

glVertexAttribPointerによって提供されるすべての値は、浮動小数点GLSL値に変換されます(まだ浮動小数点でない場合)。この変換は基本的に無料です。glVertexAttribPointerしたがって、これらの定義のいずれかをvec4属性タイプで使用できます。

glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, ...);
glVertexAttribPointer(0, 4, GL_UNSIGNED_SHORT, GL_TRUE, ...);
glVertexAttribPointer(0, 4, GL_SHORT, GL_TRUE, ...);
glVertexAttribPointer(0, 4, GL_SHORT, GL_FALSE, ...);

これらはすべてvec4 自動的にに変換されます。シェーダーは、ショート、バイト、整数、フロートなどが供給されていることを認識したり気にしたりする必要はありません。

最初のものはそのまま使用されます。2つ目は、符号なしの短距離[0、65535]を[0.0、1.0]浮動小数点範囲に変換します。3つ目は、符号付き短距離[-32768、32767]を[-1.0、1.0]範囲に変換します(ただし、変換は少し奇妙で、特定のOpenGLバージョンでは異なり、整数0を浮動小数点にマップできるようになっています。ポイント0.0)。4つ目は、浮動小数点範囲として[-32768、32767]を[-32768.0、32767.0]に変換します。

属性に使用するGLSLタイプは、glVertexAttribIPointerまたはを使用した場合にのみ変更されますglVertexAttribLPointer。どちらもOpenGLES2.0では使用できません。

つまり、属性には常にfloatGLSLタイプを使用する必要があります。OpenGLが変換を行います。

于 2012-07-26T22:33:38.640 に答える