1

私のゲームでは、世界は立方体でできていますが、立方体は四面体と 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;
}
4

1 に答える 1

1

問題は、四面体の面で、三角形間のエッジをシームレスにしたいことです。そのため、テクスチャを使用できません。(できますが、高解像度である必要があり、(たとえば水上で)色をアニメートしたい場合、これはオプションではありません)。

必ずしもそうとは限りません。OpenGL はオブジェクト全体ではなく、個々の三角形のみを認識することに注意してください。したがって、その切断面をレンダリングするときは、平らな「肉のない」対応物をレンダリングするだけでまったく違いはありません。

内側の四面体のハード エッジは、幾何学的なエッジがはるかに強力であるため、テクスチャの折り目に影響を受けません。したがって、私がすることは、これと同一平面上のすべての面で共有される、四面体表面に位置合わせされた別の 2D 平面テクスチャ空間を持つことです (補足: これを適用すると、頂点シェーダーを使用してテクスチャ座標を生成できます。頂点位置)。

つまり、単純な 2D フラット テクスチャは、最終的にいくつかの制限にぶつかります。暗黙的なサーフェス テッセレータのバリアント (バイナリ値のサーフェスを作成するスカラー フィールドを使用) を効果的に実装しているため、フラグメント シェーダーでのプロシージャル ボリューム テクスチャ生成について考えるのは理にかなっています。

于 2013-07-25T21:26:48.533 に答える