5

頂点配列で三角形ごとに 3 回その色を指定せずに、各三角形が同じ色を持つメッシュ (三角形で構成される) をレンダリングするにはどうすればよいですか。

2 つの三角形を描きたいとします。三角形 1 :

Vertex 1,  position:(x1,y1) , color: (r1,g1,b1,a1)
Vertex 2,  position:(x2,y2) , color: (r1,g1,b1,a1)
Vertex 3,  position:(x3,y3) , color: (r1,g1,b1,a1)

三角形 2 :

Vertex 4,  position:(x4,y4) , color: (r2,g2,b2,a2)
Vertex 5,  position:(x5,y5) , color: (r2,g2,b2,a2)
Vertex 6,  position:(x6,y6) , color: (r2,g2,b2,a2)

これは、2 つの頂点バッファーを作成することで実行できることがわかっています。

Vertex Buffer 1:
[x1, y1]
[x2, y2]
[x3, y3]
[x4, y4]
[x5, y5]
[x6, y6]


Vertex Buffer 2:
[r1, g1, b1, a1]
[r1, g1, b1, a1]
[r1, g1, b1, a1]
[r2, g2, b2, a2]
[r2, g2, b2, a2]
[r2, g2, b2, a2]

それらを異なる属性の場所にバインドし、通常の描画呼び出しを実行できるようになりました。

すべてのデータが一意であるため、頂点バッファー 1 は問題ありませんが、私の質問は、頂点バッファー 2 はそのようなスペースの無駄ではありませんか!? 何千もの三角形があり、このアプローチで各三角形ごとに 2 回色を複製するとどうなりますか。冗長な属性を格納するよりスマートな方法が必要です。私はそれを認識していません。誰か教えてください。

4

2 に答える 2

1

(警告: 次の解決策は、機能パイプラインが修正されていないため、問題を解決する価値がない場合があります。この回答に誤りや誤情報があればお知らせください。)

私の知る限り、OpenGL では、どの頂点も、頂点ごとに直接、または呼び出しごとに間接的に使用するデータを認識している必要があります。「次の描画呼び出しのすべての頂点がこのデータを使用する」と言うか、インデックスを使用して各頂点を対応するデータとともに1つ以上のバッファーにパックできます(あなたがしたように)。インデックスのセットは 1 つしか持てないため、1 つの頂点を 1 つの色にリンクすることしかできません。そのため、頂点が同じであっても、頂点ごとに新しい色が必要になります。つまり、これらの種類のことを 1 回の描画呼び出しで実行したい場合、データが重複することになります。

ただし、シェーダー内でインデックス付きの色を参照することで、この重複データのサイズを減らすことができます。このようにして、(たとえば) メッシュ内に 256 の異なる色を持ち、頂点ごとに 1 バイトのカラー インデックス (または 1 つの短いインデックスを持つ 256*256 色など) を持つことができます。これは、このような「簡単な」問題に対する面倒な解決策ですが、私がずっと調べてきた唯一の解決策です。

アイデアは次のようなものです:

  1. 必要なすべての色を含むバッファーを作成します。

  2. およびインデックスを使用して頂点を正しい色にリンクする頂点属性を持つメッシュを作成します。

  3. アトリビュートを受け取り、バッファ内を調べ、色を取得してフラグメント シェーダに渡す頂点シェーダを作成します。フラグメント シェーダは、この色に基づいて出力を変更します。

データは重複しますが、2 色 (2*(4*)4 バイト) ではなく、三角形ごとに 2 バイトになります。この解決策は、メッシュ内に固定された少量の異なる色があることを前提としています。このソリューションは、小さなインデックスによって参照される大きなデータに最適です。

私にとって、この解決策は確かに非常に醜く非効率的ですが、私の限られた OGL 経験では、これが唯一の解決策です。私は同様の問題に取り組んでいるので、誰かがより良い解決策を持っていると聞きたいです!

PS: 頂点データは 2 の累乗のサイズであることに注意してください。無駄なデータのパディングを回避するために使用できる場合にのみ、このソリューションが必要になる可能性があります。

于 2013-07-09T18:50:55.643 に答える