0

私は、OpenGL と GLUT (Linux、C の下) を使用して、独自のグラフィック エンジンに取り組んでいます。問題はスプライト ローダーにあります。基本的に、次のようなテクスチャの一部だけをレンダリングするためのデータを保持する構造があります。

struct Sprite {
   Vertex start,end,size;
   int textureID;
}    

そして、これを画面にレンダリングする関数があります。textureIDは、テクスチャのID を表します。頂点の開始終了は UV 座標 (0 と 1 の間) を表し、レンダリングするスプライトの左上 (開始) と右下 (終了) を指定します。頂点サイズは、スクリーン スペースでのスプライトの実際のサイズを指定します。
これは、大きなテクスチャを小さなスプライトに分割する機能の一部です。これは単なる数学の部分であり、テストするために C アプリを作成しましたが、思いどおりに動作しません。susvは開始 UV 座標 (スプライトの左上) で、 x(su) と y(sv) のようなものです。euev終了座標(スプライトの右下)です。nxnyは、テクスチャ上にある分割の数です (以下の画像では、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) は右下の座標です。画像では黄色の円で内側に緑色の円があります. UV座標

私の問題は、関数がスプライトを正しくマップしていないことです。これを追加する if(us<0) s.u=1+s.u;と、最初の行と 2 番目の行の間に、スプライト 2 と 4 が混同されてしまうことがわかりました。

4

1 に答える 1

1

式内でidを混合している理由がわかりません。さらに、スプライトの開始点と寸法だけが構造に必要です。

struct Sprite {
    Vertex start,end;
    int textureID;
} 

// nx and ny are indexes of which sprite inside the atlas do you need (index starting at 0
// xsize and ysize are the standard size of an sprite in texture space, for example
// in your example both would be 0.5
Sprite generateSprite(int nx, int ny, int xsize int ysize){
    Sprite s;
    s.start.u = xsize*nx;
    s.start.v = ysize*ny;
    s.end.u = s.start.u+xsize;
    s.end.v = s.start.v+ysize;
}

それがあなたがアーカイブしようとしていると私が思うものです。

編集: xsize と ysize は簡単に計算できます。たとえば、テクスチャが同じサイズの 4x4 スプライトを保持している場合、xsize = ysize = 1.0/4 です。

于 2013-05-04T09:06:55.680 に答える