0

私は、OpenGL ES 2.0 を使用した Android 用の独自のグラフィック エンジンを「楽しみのために」書いています。

複数のオブジェクト メッシュでシーン全体を管理した後、シャドウ ボリュームを実装しようとしています。

ロジックは (単純化されています) : まず、バイナリ ファイルからオブジェクト (頂点、面、エッジ、およびすべてのデータを含む) を作成します。その後、Vertex Buffer を作成して要素を描画します。

今までは、モデル マトリックス (glRotate など) で OpenGL 関数を使用して変換 (スケール、平行移動、回転) を使用していました。

しかし、Shadow Volume を使用するには、オブジェクトまたはライトが変換されるたびに、どの面がライトとシルエットの前にあるかを計算する必要があります。そのため、頂点配列でループを使用します。

私の質問は次のとおりです。どこで変換を行うのですか? 変更のたびに頂点配列を変換して Vertex Buffer に再ロードする必要がありますか?

これによると、それは悪いことです: Android openglはドローコール後に頂点配列を変更します

それで、ベストプラクティスは何ですか?

下手な英語で申し訳ありませんが、よろしくお願いします;)

4

1 に答える 1

1

ざっくりとシャドウボリュームしか覚えてないんですけど、記憶が正しければ、まず光の前に顔を決めて、その面の境界線がボリュームにかかるシルエットですよね?

したがって、すべての頂点法線 n とライトベクトル l に対して次のようなことを行います。

フロント = (l ドット M * n) < 0.0 ? 真/偽

ここで、M は頂点変換行列の逆転置です。

各法線に n を掛ける代わりに、ライトベクトルの適切な変換を計算できませんか...つまり、行列 Ml を次のように計算します。

(Ml * l ドット n) = (l ドット M * n)

それが私の考えです。

于 2012-07-10T07:11:12.297 に答える