2012-07-26 18 views
6

私のプログラムをGLfloatから頂点位置のGLshortに変換しようとしていますが、これをシェーダでどのように表現するのか分かりません。シェーダでvec3データ型を使用していましたが、vec3は3つの浮動小数点数を表します。今私は3つの短編を表現する必要があります。限り、私はOpenGLはショートパンツのベクトルを持っていないと言うことができるので、私はこの場合何をすべきでしょうか?頂点にGLfloatの代わりにGLshortを使用する

答えて

16

シェーダでこれをどのように表現するのか分かりません。

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

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

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]の範囲(though the conversion is a bit odd and differs for certain OpenGL versions, so as to allow the integer 0 to map to the floating point 0.0)に変換します。 4つ目は[-32768、32767]から[-32768.0、32767.0]に浮動小数点範囲として変換します。

属性に使用するGLSLタイプは、glVertexAttribIPointerまたはglVertexAttribLPointer(どちらもOpenGL ES 2.0で使用できません)を使用する場合にのみ変更されます。

要するに、属性には常にfloat型のGLSL型を使用する必要があります。 OpenGLが変換を行います。

+0

回答を読んだ後、私は次のような印象を受けました:http://stackoverflow.com/a/1316494/256062およびhttp://stackoverflow.com/a/5721102/256062 – Xavier

+0

@Xavier:あなたはポイントを逃した。頂点データのサイズは、GLSL属性変数ではなく、 'glVertexAttribPointer'によって定義されます。シェーダ内のより小さなコンポーネントを表現する必要はありません。ハードウェアは小さなコンポーネントからより大きなコンポーネントに変換します*。 –

+0

@ nicol-bolas符号付きデータ型の場合、変換された範囲は( 'short'の場合)' [-32768,32767] 'であり、' [-32767,32767] 'ではないと確信していますか?この[記事](http://www.informit.com/articles/article.aspx?p=2033340&seqNum=3)は、オレンジブックからとられているように、教え方が異なっているようです。それは、変換は署名された型の分割に過ぎないと言います。その場合、短い値 '-32768'は浮動小数点GLSL値' -32768/32767 = -1.000305185..'に変換されます。私は、仕様が正しいかどうかをどこで見つけることができません。 – wil

関連する問題