私のゲームでは、世界は立方体でできていますが、立方体は四面体と 4 つの角の 5 つの部分に分かれています。各タイプのブロックには 2 つの色があります。これは、1 つの角が切り取られた場合のブロックの外観ですが、各角/面は残りの色とは異なる場合があります。
問題は、四面体の面で、三角形間のエッジをシームレスにしたいことです。そのため、テクスチャを使用できません。(できますが、高解像度である必要があり、(たとえば水上で)色をアニメーション化する場合、これはオプションではありません)。
私はこれらのアプローチを見つけました:
各四面体面に各三角形を描画し、次に各立方体面に各正方形を描画します (VBO などを使用)ポリゴンが
多すぎます! ラグが発生します。そして、これは四面体をレンダリングするだけでした。ワールド ジオメトリで
のフラグメント シェーダーの使用 計算は簡単です。各軸について、ポイントがキューブ内で 0.5 未満かどうかを調べ、結果を xor します。これにより、使用する色が決まります。ラグが発生しましたが、コードが悪いと思います。ワールド ジオメトリの 3D テクスチャ
これが私の状況に完全に一致することを考えると、これが最良のオプションのようですが、実際にはわかりません。上記のいずれかでインスタンス化されたジオメトリを使用すると、
これについてはわかりません。大規模な場合、インスタンス化が遅くなる可能性があることを読みました。非表示のサーフェスをスキップするように最適化する場合は、31 個以上のメッシュが必要になります (これはおそらく不要です)。ジオメトリ シェーダーを使用する ジオメトリ シェーダー
は大規模ではうまく機能しないと読んだことがあります。
これらのオプションのどれが最も効率的ですか? 3Dおよび2D テクスチャを使用するのが最善の選択肢かもしれませんが、ラグが発生する場合は、非効率的なアプローチではなく、悪いコードを使用しているためであることを確認したいと思います。
編集:これが私のシェーダーコードです
#version 150 core
in vec4 pass_Position;
in vec4 pass_Color1;
in vec4 pass_Color2;
out vec4 out_Color;
void main(void) {
if ((mod(abs(pass_Position.x),1f)<=0.5f)^^(mod(abs(pass_Position.y),1f)<=0.5f)^^(mod(abs(pass_Position.z),1f)<=0.5f)) out_Color = pass_Color1;
else out_Color = pass_Color2;
}