0

固定 VBO 配列を使用して、シェーダー プログラムのランタイムを切り替えたい。

固定頂点属性インデックスを持つ次の関数だけが必要だと思います(位置には0、テクスチャ座標には1が必要です)

glEnableVertexAttribArray
glVertexAttribPointer
glGetAttribLocation
glBindAttribLocation

すべてを配線しましたが、FBO には何も引き寄せられませんでした。プログラムから見つけた頂点属性インデックス (glVertexAttribPointer 内) を使用すると、正常に動作しますが、固定属性インデックスでは使用できません。

上記の関数の正しい使用法/実行順序を示す簡単なサンプル コードを誰かに見せてもらえますか?

足りないステップはありますか?

4

2 に答える 2

3

ポイントは次のとおりです。プログラムをリンクする前に glBindAttribLocation を呼び出す必要があります。

glBindAttribLocation(program, ATTRIBUTE_POSITION, "position");
glBindAttribLocation(program, ATTRIBUTE_TEXTURE_COORDINATES, "textureCoordinates");      
glLinkProgram(program);

次に、次のように、固定インデックスで属性配列関数を使用できます。

glEnableVertexAttribArray(ATTRIBUTE_POSITION);
glEnableVertexAttribArray(ATTRIBUTE_TEXTURE_COORDINATES);    
glVertexAttribPointer(ATTRIBUTE_POSITION, 2, GL_FLOAT, GL_FALSE, _positionStride, (void*)0);    
glVertexAttribPointer(ATTRIBUTE_TEXTURE_COORDINATES, 2, GL_FLOAT, GL_FALSE, _positionStride, (void*)_textureCoordinatesOffset);  

インデックスは次のように単純な整数です。

//Vertex attributes.
enum 
{
    ATTRIBUTE_POSITION,            //0
    ATTRIBUTE_TEXTURE_COORDINATES  //1
};

それは今動作します。したがって、すべての描画呼び出しの前に glVertexAttribPointer を呼び出す必要はありません。

于 2012-04-21T10:00:01.097 に答える
0

ドキュメントが言うように (http://www.opengl.org/sdk/docs/man/xhtml/glBindAttribLocation.xml):

プログラム オブジェクトの属性変数名からジェネリック属性インデックスへのバインディングは、glBindAttribLocation を呼び出すことによっていつでも明示的に割り当てることができます。属性バインディングは、glLinkProgram が呼び出されるまで有効になりません。プログラム オブジェクトが正常にリンクされた後、ジェネリック属性のインデックス値は、次のリンク コマンドが発生するまで固定されたままになります (そして、それらの値を照会できます)。

アプリケーションは、必要に応じて自動的にバインドされるため、このコマンドを使用して標準の OpenGL 頂点属性をバインドすることはできません。プログラム オブジェクトがリンクされた後に発生する属性バインディングは、次にプログラム オブジェクトがリンクされるまで有効になりません。

于 2012-04-21T10:54:23.363 に答える