スプライト シートとして使用したいテクスチャ (この場合は 8x8 ピクセル) があるとします。サブイメージ (スプライト) の 1 つは、次のイメージのように、テクスチャ内の 4x3 のサブ領域です。
(四隅の正規化されたテクスチャ座標が表示されます)
テクスチャ座標を 4px x 3px サイズのクワッドに割り当てて、効果的に探しているスプライトにする方法は基本的に 2 つあります。最初の最も簡単な方法は、サブ領域の角でテクスチャをサンプリングすることです。
// Texture coordinates
GLfloat sMin = (xIndex0 ) / imageWidth;
GLfloat sMax = (xIndex0 + subregionWidth ) / imageWidth;
GLfloat tMin = (yIndex0 ) / imageHeight;
GLfloat tMax = (yIndex0 + subregionHeight) / imageHeight;
この方法を最初に実装したときは、ca. 2010 年に、スプライトがわずかに「歪んでいる」ように見えることに気付きました。少し検索した後、cocos2d フォーラムで、スプライトをレンダリングするときにテクスチャをサンプリングする「正しい方法」は次のとおりであると説明している投稿を見つけました。
// Texture coordinates
GLfloat sMin = (xIndex0 + 0.5) / imageWidth;
GLfloat sMax = (xIndex0 + subregionWidth - 0.5) / imageWidth;
GLfloat tMin = (yIndex0 + 0.5) / imageHeight;
GLfloat tMax = (yIndex0 + subregionHeight - 0.5) / imageHeight;
...そしてコードを修正した後、しばらくは幸せでした。しかし、途中のどこかで、おそらく iOS 5 が導入された頃だと思いますが、自分のスプライトが見栄えがよくないと感じ始めました。いくつかのテストの後、「青」の方法 (2 番目の画像) に戻しました。
私は夢中になっているのでしょうか、それとも GL ES テクスチャ マッピングに関連して iOS 5 で何かが変わったのでしょうか? おそらく私は何か他のことを間違っていますか?(例えば、頂点の位置座標が微妙にずれている?テクスチャの設定パラメータが間違っている?)でも、コードベースは変わらないので、最初から何か間違っているのでしょうか...?
つまり、少なくとも私のコードでは、以前は「赤」の方法が正しかったように感じますが、現在は「青」の方法の方が良い結果が得られます。
今のところ、私のゲームは問題ないように見えますが、遅かれ早かれ修正しなければならない何かが半分間違っていると感じています...
アイデア/経験/意見はありますか?
補遺
上記のスプライトをレンダリングするには、次のように、正投影で 4x3 の四角形を描画します。各頂点には、前述のコードで暗示されたテクスチャ座標が割り当てられます。
// Top-Left Vertex
{ sMin, tMin };
// Bottom-Left Vertex
{ sMin, tMax };
// Top-Right Vertex
{ sMax, tMin };
// Bottom-right Vertex
{ sMax, tMax };
元のクワッドは (-0.5, -0.5) から (+0.5, +0.5) まで作成されます。つまり、画面の中心にある単位正方形であり、サブ領域のサイズ (この場合は 4x3) にスケーリングされ、その中心は整数 (x,y) 座標に配置されます。特に幅、高さ、またはその両方が偶数でない場合、これにも何か関係があるにおいがしますか?
補遺2
この記事も見つけましたが、まだまとめようとしています (ここは午前 4 時です) http://www.mindcontrol.org/~hplus/graphics/opengl-pixel-perfect.html