2012-04-21 13 views
0

固定VBO配列を使用して、実行時のシェーダプログラムを切り替える必要があります。私は一定の頂点に以下の機能よりも多くを必要としないthik頂点の属性をシェーダーに伝える方法は?

がインデックス(I位置に0をしたい、テクスチャ座標のための1)

glEnableVertexAttribArray 
glVertexAttribPointer 
glGetAttribLocation 
glBindAttribLocation 

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

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

手順がありませんか?

+3

-1: "私に、上記の関数の正しい使用法/実行順序を示す短いサンプルコードを表示できますか?"これは尋ねるのは恐ろしいことです。それらの機能がどのような順序で入ってくるのかわからない唯一の方法は、あなたが何をしているのかわからない場合です。だからあなたはこれらの機能がどのように機能するのかを尋ねる必要があります。それ以外の場合は、コピー&ペーストコーディングだけです。 –

+0

@ニコル:これは - http://www.opengl.org/sdk/docs/man/xhtml/glBindAttribLocation.xml - 本当にいいですが、実行命令については何も教えてくれません。 – Geri

+0

私は本当にglBindAttribLocationが何をしているのか知っていますが、私のプログラムをリンクして使用しただけではうまくいかない場合、どこに行くのか分かりません。 – Geri

答えて

3

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

として指数は、単純な整数です
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 
}; 

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

次に、あなたは次のように、固定のインデックスを持つ属性の配列関数を使用することができます。だから私はすべての描画呼び出しの前にglVertexAttribPointerを呼び出す必要はありません。

+0

これは以下を助けました:http://samplecodebank.blogspot。com/2011/05/glbindattriblocation-example-c-c-objc.html – Geri

0

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

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

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

関連する問題