2017-05-07 16 views
0

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になっていないのはなぜですか?

答えて

1

layout(location=0)は、glEnableVertexAttribArrayglVertexAttribPointerの属性インデックスを取得するためにglGetVertexAttribLocationに電話する必要はないことを意味します。これらの呼び出しはまだ必要です。あなたはまだあなたがまだ有効コールを定義さなど

+0

正規化、データ型と同様に、glVertexAttribPointerのパラメータである情報を提供する必要があるため

シェーダ宣言は十分ではないでしょうか? (これが有効になっているかどうかはわかりません)、glVertexAttribPointerのparam情報を入れる必要があります。なぜシェーダ変数がサイズ/ストライド/タイプ情報について知っているのでしょうか?しかし、基本的に 'layout(location = 1)'と言うと、確実にインデックス1を有効にし、インデックス1のattribPointer情報も設定できますか? –

+0

@AlexBollbach属性が有効でない場合( 'glEnableVertexAttribArray')、レンダリング時には使用されません。はい、 'layout(location = 1)'は 'glVertexAttribPointer'で確実にインデックスを1に設定できることを意味します。 – SurvivalMachine