2015-11-03 25 views
9

私はいくつかのOpenGLを学んできました。取り入れることはたくさんあり、初心者ですが、私はGLSLの "Layout Qualifier"について理解していません。OpenGL:レイアウト修飾子?

したがって、このような何か:このような単純な頂点シェーダで

layout (location = 0) in vec3 position; 

#version 330 core 
layout (location = 0) in vec3 position; // The position variable has attribute position 0 

out vec4 vertexColor; // Specify a color output to the fragment shader 

void main() 
{ 
    gl_Position = vec4(position, 1.0); // See how we directly give a vec3 to vec4's constructor 
    vertexColor = vec4(0.5f, 0.0f, 0.0f, 1.0f); // Set the output variable to a dark-red color 
} 

私は(thatsのは、フラグメントシェーダに行く以降)インスタンスのうちvec4を理解しています。また、vertexColorは理にかなっています。

しかし、多分イムは、「位置」とまさにそれは、この意味での意味を理解していませんか?誰かが説明する気になる?正直なところ、OpenGL Wikiは私を助けませんでした。

しかし、多分イム誤解何頂点シェーダ(イムまだもちろん、パイプラインの少しわかりません)。私の理解から、頂点の指定は最初に正しいことですか? (必要に応じて頂点/インデックス)を作成し、VAOに格納します。

だから、頂点シェーダは、個々の頂点と相互作用していますか?私はそれをどのように理解していたのでしょうか?

答えて

9

そうです、頂点シェーダは各頂点に対して実行されます。

頂点が(位置、法線、テクスチャ座標など)または複数の属性で構成されています。 CPU側で

あなたはVAOを作成するとき、あなたは「このバッファにこのデータは属性0になり、それに次のデータ等の属性1になります」と言って、各属性について説明します。 VAOは、この情報をどこの人しか格納していないことに注意してください。実際の頂点データはVBOに格納されます。

頂点シェーダでは、レイアウトと位置のある行は「属性0を取得し、それを位置という変数に入れてください」という意味です(の位置は属性の番号を表します)。

二つのステップが正しく行われている場合、あなたは位置という名前の変数内の位置で終わる必要があります:)それは明確ですか?

+1

なぜゼロを使用するのですか? – msmith1114

+1

例えば、位置と法線があれば、属性0と属性1の法線に位置付けることができます。属性0には両方を入れることはできません。 – Jerem

+0

属性0の位置のようなもの、または1やそのようなもの。 – msmith1114