木が植えられたランダムな島をレンダリングするアプリを書いています。木は現在2つのクワッドであり、十字で交差し、テクスチャで描かれています。ヤシの木、オーク、草など、さまざまな種類の植物を形成するより複雑なメッシュを使用する予定です。
私が直面する問題は、テクスチャが透明であるため、後ろから前に描画する必要があるということです。Plan-bは、fragシェーダーで破棄を使用することを呼び出しますが、zオーダーの方がより良い結果を提供します。
uniform float uTreeAlpha;
uniform sampler2D uTexture;
varying vec2 vTexCoordOut;
void main (void)
{
vec4 colour = texture2D(uTexture, vTexCoordOut);
if (colour.a < 0.1) {
discard;
}
gl_FragColor = vec4(colour.rgb, colour.a * uTreeAlpha);
}
2番目の問題は、カメラとルックアットによって順序が変わるためです。OpenGLで1回の呼び出しでそれらを描画する効率的な方法がわかりません。
現在、私のレンダリングコードは次の疑似コードのように見えます。
if cameraChangedFromLastTime() then
sortTreesBackToFront();
end
for i = 0 to trees.size() -1
drawTree()
end
すべてのdrawTree()がいくつかのユニフォームを設定し、テクスチャを設定してから、glDrawArrays()を呼び出します。最後のツリーと現在のツリーが同じである場合、テクスチャの設定またはテクスチャ座標の更新をスキップするための最適化がいくつかあり、ループの外側にいくつかの一般的なユニフォームを設定します。ループを3000回移動します。
各ツリーを個別に描画すると、パフォーマンスが大幅に低下します。単一の呼び出しまたはバッチ(Zオーダーを維持しながら)でそれらを描画できれば、おそらく1/10の時間でそうなるでしょう。
では、どうすればよいでしょうか。私のツリーはプレースホルダーであり、最終的には次のようになることに注意してください。
- 異なる木のための異なるメッシュ
- いくつかのより多様性を与えるために、木の異なるスケールと角度
- 異なるツリーの異なるテクスチャー、メッシュに適用される可能性のある複数のテクスチャー(例えば、1つのテクスチャーを残し、別のテクスチャーをトランクする)
- 木はすべて一緒に混合されているため、ある種類を次に別の種類を描画する簡単な方法はありません
- 何らかの形の単純な循環アニメーション(枝が風に揺れる)
- すべてのテクスチャは単一のアトラスに存在します
では、ここでの最善のアプローチは何ですか?シングルパスでレンダリングすることは可能ですか?glDrawElementsを使用して、頂点ではなくインデックスを再構築した場合、これを達成できますか?