2011-08-28 15 views
7

異なる頂点属性を異なる頂点バッファに格納することは可能ですか?このような異なるVBOに異なる頂点属性を格納する

私はこれまでのところ、この

float data[] = 
{ 
//position 
    v1x, v1y, v1z, 
    v2x, v2y, v2z, 
    ... 
    vnx, vny, vnz, 

//color 
    c1r, c1g, c1b, 
    c2r, c2g, c2b, 
    ... 
    cnr, cng, cnb, 
}; 
GLuint buffname; 
glGenBuffers(1, &buffname); 
glBindBuffer(GL_ARRAY_BUFFER, buffname); 
glBufferData(GL_ARRAY_BUFFER, sizeof(data), data, GL_STATIC_DRAW); 

ような何かを行うと描画が行われる見てきたすべての例何か:

glBindBuffer(GL_ARRAY_BUFFER, buffname); 
glEnableVertexAttrib(position_location); 
glEnableVertexAttrib(color_location); 
glVertexAttribPointer(position_location, 3, GL_FLOAT, GL_FALSE, 0, 0); 
glVertexAttribPointer(color_location, 3, GL_FLOAT, GL_FALSE, 0, (void*)(3*n)); 

glDrawArrays(GL_TRIANGLES, 0, n/3); 

glDisableVertexAttrib(position_location); 
glDisableVertexAttrib(color_location); 
glBindBuffer(GL_ARRAY_BUFFER, 0); 

は、位置データを格納することが不可能であり、異なるVBOのカラーデータ?問題は、一度に2つのバッファをバインドできないため、これがどのように機能するのか分かりません。

シンプルだが非効率的な解決策がある場合、私は初級の学習状態にあるので、より複雑で効率的な解決策よりも優先したいと思うし、あまり複雑にしたくない。

また、私が聞いていることが可能なら、いいアイデアかどうか?明確にするために

私は別のVBOの中に異なる属性を保存することができる方法を理解します。後でどのように描くのか分かりません。

答えて

9

属性の場所Xとその属性を提供するバッファオブジェクトとの間の関連付けは、glVertexAttribPointerコマンドで行われます。それが動作する方法は簡単ですが、直感的ではありません。時間glVertexAttribPointer

は、XがglVertexAttribPointerの最初のパラメータである属性X、関連付けられてなったオブジェクトが現在GL_ARRAY_BUFFERにバインドされているものは何でもバッファ、(それは多くの人が取得しない部分です)と呼ばれています。あなたが別のバッファに属性を分割すべきかどうかについては

glEnableVertexAttrib(position_location); 
glEnableVertexAttrib(color_location); 
glBindBuffer(GL_ARRAY_BUFFER, buffPosition); 
glVertexAttribPointer(position_location, 3, GL_FLOAT, GL_FALSE, 0, 0); 
glBindBuffer(GL_ARRAY_BUFFER, buffColor); 
glVertexAttribPointer(color_location, 3, GL_FLOAT, GL_FALSE, 0, 0); 

:あなたは一つのバッファから来ている属性と他から来ているの属性を持つようにしたい場合は

だから、あなたがこれを行います。私はあなたがデモがある場合にのみそれを行うべきであると言うでしょうが必要です。

たとえば、おそらく何らかの水効果のために、動的な高さマップを作成しているとします。各要素のZ位置が変化しますが、これは法線が変化することを意味します。しかしながら、XY位置及びテクスチャ座標は変化しない。

効率的なストリーミングでは、バッファオブジェクトをダブルバッファリングするか無効にする(glBufferData(NULL)またはglMapBufferRange(GL_INVALIDATE_BIT)を使用してバッファオブジェクトを再割り当てする必要があります)。どちらの方法も、ストリーミングされたデータが非ストリーミングデータの別のバッファオブジェクトにある場合にのみ機能します。

説明可能なもう1つの例は、メモリが懸念され、いくつかのオブジェクトが特定の属性リストを共有する場合です。おそらく、オブジェクトは位置と通常の配列が異なりますが、同じ色とテクスチャの座標配列を持ちます。またはそのようなもの。

それ以外の場合は、オブジェクトのすべてを1つのバッファに入れるだけです。配列をインターリーブしなくても。

+1

ありがとうございます!わかりました!突然もっと多くのことが明らかになった:)))私の2番目の質問はどうですか?それは一般的に良いアイデアかどうか? –

+1

@Armen:私の編集を参照してください。 –

+0

私はそれをもっとはっきりと見ています。どうもありがとう。したがって、単純なケースではNicolが述べた最初のアプローチを使用する必要があり、必要な場合は別のVBOを使用する必要があります。はるかに明確な感謝! –

関連する問題