2017-11-05 2 views
0

に私は最近、貪欲なメッシュを使用してボクセルゲームに取り組んでいます。顔は1 * 1から64 * 64まで変化します。ゲームのフラットエリアでは、複数の小さな地形タイルをタイル張りのテクスチャを持つ大きなタイルタイルに組み合わせるのが理にかかりますが、これはスプライトアトラスの問題です。各uvにはアトラス上の地点の参照がありますが、大きい場合はグレーディーにテクスチャが伸びます。私は、大きな顔が小さなものの束であり、余分なジオメトリがない場合と同じ結果を生み出すために、顔ごとに正しい時間を並べることを望みます。ここでタイル+テクスチャアトラスは、ペイ・パー・フェイス基礎

は、私はそれがOpenGLで達成された何をしたいの例です:

OpenGl Face-Based-Tiling

は大きな顔が小さいものの印象を与えるためにタイル張りされている方法を参照してください?テクスチャは次のようにアトラスからだった:

Texture Atlas

私は唯一の団結でシェーダの基本的な知識を持っていますが、どのように私はこれを達成するために団結でシェーダを書くのでしょうか?

答えて

0

これを実行するには、まずシェーダに数ビットの情報を渡す必要があります。顔のxとyの大きさ(タイル単位)と、左下と右上のuv座標タイル。その後、UVが左下隅からスプライトの右上隅に顔のUV値(inputUV)の範囲を想定した座標計算するには、次の式を使用することができます。

float2 newUV = (inputUV - llCorner)/(urCorner - llCorner); //converts from input uv to values between (0.0, 0.0) and (1.0, 1.0) 
newUV.x = newUV.x * xDim % 1; //makes the newUV coordinates repeat xDim times on the x axis 
newUV.y = newUV.y * yDim % 1; //makes the newUV coordinates repeat yDim times on the y axis 
newUV = newUV*(urCorner - llCorner) + llCorner; //converts values between (0.0, 0.0) and (1.0, 1.0) to values between the lower left corner and the upper right corner 

私は実際にそれをテストしていませんが、しかし、私はこれがうまくいくと思います。私はこれが助けて欲しい!