web-dev-qa-db-ja.com

OpenGL:レイアウト修飾子?

だから私はいくつかのOpenGLを学んでいる、それを取り入れることはたくさんあるし、初心者にすぎないが、GLSLの「レイアウト修飾子」を理解していない。

だからこのようなもの:

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
}

たとえば、out vec4を理解しています(それはフラグメントシェーダーに行くためです)。そして、例えばvertexColorは理にかなっています。

しかし、「位置」を理解していないのかもしれませんが、この意味で正確に何を意味するのでしょうか?誰か説明したいですか? opengl wikiは正直私を助けませんでした。

しかし、おそらく頂点シェーダーと誤解しているかもしれません(もちろん、パイプラインについてはまだ少しわかりません)。しかし、私の理解から、頂点仕様は私たちが最初に修正することですか? (必要に応じて頂点/インデックス)、これらをVAOに格納します。

それで、頂点シェーダーは個々の頂点ポイントと相互作用していますか? (私は願っています)それが私がそれを理解した方法だからです?

18
msmith1114

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

頂点は、いくつかの属性(位置、法線、テクスチャ座標など)で構成されます。

VAOを作成するときのCPU側では、「このバッファー内のこのデータは属性0、その隣のデータは属性1などになる」と言って各属性を記述します。 VAOは、どこに誰のこの情報のみを保存することに注意してください。実際の頂点データはVBOに格納されます。

頂点シェーダーでは、レイアウトと位置のある行は、「属性0を取得して位置と呼ばれる変数に配置する」とだけ言っています(locationは属性の数を表します)。

2つのステップが正しく行われている場合は、positionという名前の変数内の位置になるはずです:)明確ですか?

19
Jerem