2013-09-21 8 views
11

GLSLに関するチュートリアルを読みました。 特定の位置属性には、vec3のvec4があります。 行列演算にはvec4が必要ですが、追加要素を送る価値はありますか? vec3を送信して後でshader vec4(position、1.0)にキャストする方が良いですか? メモリ内のデータが少ない - 高速になるでしょうか?または、キャスティングを避けるために余分な要素をパックする必要がありますか?シェーダの位置vec4またはvec3

ヒント何が良いはずですか?頂点属性について

layout(location = 0) in vec4 position; 
MVP*position; 

または

layout(location = 0) in vec3 position; 
MVP*vec4(position,1.0); 

答えて

19

、これは問題ではありません。 4番目のコンポーネントが存在しない場合、自動的に1.0に展開されます。

つまり、3次元頂点属性ポインタを4次元ベクトルに渡すと、GLはW1.0で埋め込みます。私は常にこのルートを使います。位置に行列乗算を行うときには、vec4 (...)を明示的に書く必要がありません。また、4番目のコンポーネントを格納するメモリを浪費することもありません。

これは2D座標でも機能します。 vec4属性に渡される2D座標はvec4 (x, y, 0.0, 1.0)になります。一般的なルールは次のとおりです。不足しているコンポーネントはすべて0.0に置き換えられます(を除く)。これは1.0に置き換えられます。

ただし、この状況でGLSLの動作を認識していない人にとっては、混乱する可能性があります。これはほとんどのチュートリアルがこのトピックに触れることはないと思います。

+0

私が使用できることを意味しますか: glBufferSubData(GL_ARRAY_BUFFER、0、頂点* 3、データ); glVertexAttribPointer(0,3、GL_FLOAT、GL_FALSE、0、0); シェイダーでは、 「vec4の位置にレイアウト(位置= 0)を使用します;」表現? – Skides

+2

はい、そういう意味です。これを行うと、GLSLはアクセスしようとするたびにWに1.0を追加します。 –

+0

ちょっと速い質問です:これは 'GLfloat'以上に適用されますか?つまり、 'dvec2' - >' dvec4'または 'ivec2' - >' ivec4'でも同じ展開が起こりますか? – ThePhD

関連する問題