私は、OpenGL と GLUT (Linux、C の下) を使用して、独自のグラフィック エンジンに取り組んでいます。問題はスプライト ローダーにあります。基本的に、次のようなテクスチャの一部だけをレンダリングするためのデータを保持する構造があります。
struct Sprite {
Vertex start,end,size;
int textureID;
}
そして、これを画面にレンダリングする関数があります。textureIDは、テクスチャのID を表します。頂点の開始と終了は UV 座標 (0 と 1 の間) を表し、レンダリングするスプライトの左上 (開始) と右下 (終了) を指定します。頂点サイズは、スクリーン スペースでのスプライトの実際のサイズを指定します。
これは、大きなテクスチャを小さなスプライトに分割する機能の一部です。これは単なる数学の部分であり、テストするために C アプリを作成しましたが、思いどおりに動作しません。suとsvは開始 UV 座標 (スプライトの左上) で、 x(su) と y(sv) のようなものです。euとev終了座標(スプライトの右下)です。nxとnyは、テクスチャ上にある分割の数です (以下の画像では、2 つの水平分割と 2 つの垂直分割があります。id は、必要なスプライトを表します。
s.u=(1.0f/nx)*(id%nx-1);
s.v=(1.0f/ny)*(ny-id/nx);
e.u=s.u+(1.0f/nx);
e.v=s.v-(1.0f/nx);
たとえば、関数に id=1、nx=2、ny=2 という数字を指定すると、start(0;1) と end(0.5;0.5) という座標が返されます。start(0;1) は左上の座標で、画像では黄色の円で内側に赤い円があり、end(0.5;0.5) は右下の座標です。画像では黄色の円で内側に緑色の円があります.
私の問題は、関数がスプライトを正しくマップしていないことです。これを追加する if(us<0) s.u=1+s.u;
と、最初の行と 2 番目の行の間に、スプライト 2 と 4 が混同されてしまうことがわかりました。