Swift PlaygroundでOpen GLES 3.0 API(付属のコア330GLSLシェーダ言語を使用)を試しています。Open GLES 3.0のレイアウト修飾子
layout(location = 0) in vec4 a_Position;
レイアウト修飾子の私の理解では、それはa_Position
が頂点バッファオブジェクトの属性指標である指定されている:私は私の頂点シェーダの上部に次の宣言を持っています。 (VAOの私の理解としての緩やかな..)。
glEnableVertexAttribArray(0)
glVertexAttribPointer(
0,
3,
GLenum(GL_FLOAT),
GLboolean(GL_FALSE),
GLsizei(MemoryLayout<Vertex>.size),
BUFFER_OFFSET(0))
しかし、それはすでにどこa_Position
指定されたとして、レイアウト修飾子の私の理解では、これは必要ではないことを私に示唆しています頂点属性配列にあります。 (インデックス0)。
私はいくつかの細かいディテールが不足しているか、またはGPUのシェーダーでVAOデータにアクセスする方法がわかっていません。それはおそらく両方です。だから、私の頂点の位置を得るのに十分なレイアウト修飾子を使ったシェーダ宣言がa_Position
になっていないのはなぜですか?
正規化、データ型と同様に、
glVertexAttribPointer
のパラメータである情報を提供する必要があるためシェーダ宣言は十分ではないでしょうか? (これが有効になっているかどうかはわかりません)、glVertexAttribPointerのparam情報を入れる必要があります。なぜシェーダ変数がサイズ/ストライド/タイプ情報について知っているのでしょうか?しかし、基本的に 'layout(location = 1)'と言うと、確実にインデックス1を有効にし、インデックス1のattribPointer情報も設定できますか? –
@AlexBollbach属性が有効でない場合( 'glEnableVertexAttribArray')、レンダリング時には使用されません。はい、 'layout(location = 1)'は 'glVertexAttribPointer'で確実にインデックスを1に設定できることを意味します。 – SurvivalMachine