テクスチャ描画時にノイズが発生
furafura 2014/10/24(Fri) 10:07
お世話になっております。
先日教えて頂いた事等を参考にして記述したものです。
現在の利用部分を抜粋し、加工したものとなっております。
enum {
CG_DIR_ORGINAL = 0, /* そのまま */
CG_DIR_VREVERSE, /* 横反転 */
CG_DIR_HREVERSE, /* 縦反転 */
};
UINT Parts[GUI_CG_MAX * 5] = {
/*
000=進む
テクスチャ上の座標・大きさ・方向
*/
64,224, 32,32, CG_DIR_VREVERSE,
/*
001=戻る
*/
64,224, 32,32, CG_DIR_ORGINAL,
};
VOID PutCG(UINT num, INT x, INT y)
{
double ips = 8.0;
UINT *gp = &Parts[num * 5];
UINT u = *gp++;
UINT v = *gp++;
UINT wu = *gp++;
UINT wv = *gp++;
Quad quad2;
quad2 = Rect(x, y, wu * ips, wv * ips).rotate(0);
switch(*gp) {
case CG_DIR_ORGINAL:
quad2(TextureAsset(L"CG")(u, v, wu, wv)).draw();
break;
case CG_DIR_VREVERSE:
quad2(TextureAsset(L"CG")(u, v, wu, wv).mirror()).draw(Alpha(255));
break;
case CG_DIR_HREVERSE:
quad2(TextureAsset(L"CG")(u, v, wu, wv).flip()).draw();
break;
}
}
256色透過付き256*256ドットPNGファイルを、2Dアプリケーションでのテクスチャとして利用しております。
上記ソースのips(=倍率)を8.0ぐらいにしていますと、テクスチャ上には存在しない、線が発生し困っております。添付画像の通り「枠」を感じる線が出現しております。
私の間違った所や回避方法がございましたら、教えて頂ければ幸いです。
Reputeless 2014/10/24(Fri) 15:46
Texture を拡大して描画すると、本来の境界を越えてテクスチャがフィルタリングされるという GPU の仕様が原因です。
問題が発生する画像ファイルがどのようなものかわからないので最適な提案はできませんが
[A] 拡大描画時にフィルタリングをしない
[B] Texture の切り抜きを行わず(重要)、フィルタリングのアドレスモードを、境界を越えない Clamp にする
[C] 画像内に描かれているものの間隔を十分にあける
といった解決法が考えられます。
[A] [B] に関しては次のプログラムで試せます。描画結果の左上に注目してください。
https://gist.github.com/Reputeless/44540198a72429898829