DXライブラリのLoadDivGraphのようにテクスチャを分割して描画できるクラスを作りたいのですがあるところでつまづいていて困っています。
// テクスチャを読み込んで分割して描画できるクラス(擬似スプライトクラスでIDirect3DTexture9*(LPDIRECT3DTEXTURE9)を内部に持ってます)
CDivSprite graphic;
// 読み込む画像へのパス, 透過色, 総分割数, 横方向に対する分割数, 縦方向に対する分割数, 分割する横サイズ, 分割する縦サイズ
graphic.Create("Cat.bmp", 0xff000000, 4, 2, 2, 32, 32);
// 分割した画像の添え字(総分割数が4なので0~3), x座標, y座標 z座標
graphic.Draw( 0, x, y, z);
という感じで扱えるように実装したいのです。一通り書いて実行したのですが、どうも2段目以降の画像の上端がずれているらしく、上端に一段上の画像の下端が少し(1ピクセルにもみたない)表示されてしまいます。
1枚のテクスチャに分割数だけUVマッピングを行って分割するように実装しているので、そこでずれてしまっていると思うのですが、解決策を教えて貰えると助かります。
/*
m_DivAllNum: 総分割数
m_DivXNum: 横に対する分割数
m_DivYNum: 縦に対する分割数
m_TextureUV[m_DivAllNum][4] : D3DXVECTOR2型 各分割された画像一枚一枚のUV座標
*/
//--------------------------------------------------------------
// UVマッピング
//--------------------------------------------------------------
m_TextureUV = new D3DXVECTOR2[m_DivAllNum][4];
WORD x,y,num;
for(y = 0; y < m_DivYNum; ++y){
for(x = 0; x < m_DivXNum; ++x){
num = y * m_DivXNum + x; // 番号計算
// 分割総数を越えたら抜ける(yの条件は満たすと思うんでfor文二つとも抜けれるはず)
if(num >= m_DivAllNum)
break;
m_TextureUV[num][0] = D3DXVECTOR2((float)(x * m_DivWidth) / m_TextureWidth, (float)(y * m_DivHeight) / m_TextureHeight); // 左上
m_TextureUV[num][1] = D3DXVECTOR2((float)((x+1) * m_DivWidth) / m_TextureWidth, (float)(y * m_DivHeight) / m_TextureHeight); // 右上
m_TextureUV[num][2] = D3DXVECTOR2((float)(x * m_DivWidth) / m_TextureWidth, (float)((y + 1) * m_DivHeight) / m_TextureHeight); // 左下
m_TextureUV[num][3] = D3DXVECTOR2((float)((x+1) * m_DivWidth) / m_TextureWidth, (float)((y + 1) * m_DivHeight) / m_TextureHeight);// 右下
}
}
ちなみに、左上のUV座標のV座標に+0.00001するだけでも上端のやつは消えるので、それで解決するといえば解決するのですが、ちゃんとした解決法があるなら知りたいのです。恐らく最下位の小数点を切り上げられれば解決するような気が・・・するような関係ないような気がしてます。
すごくわかり辛くてすみません。;
言って貰えれば必要な情報を書き加えますです。
どうかよろしくお願いいたします。