テクスチャ描画時にノイズが発生
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
furafura 2014/10/25(Sat) 18:12
様々な対象方法、大変に参考になりました。
いつもありがどうございます。
今の所[A]で行くつもりです。
[B]については「切り抜きを行ったまま」でやって、巧くいったものもあったのですが、やはり駄目なものは駄目です。「切り抜きしない」選択肢は今後検討しようと思います。
[C]については試していませんが、現在の切り抜き画像が32*32ドットで一杯に隣接状態で描かれておりますが、拡大率と画像内間隔の目安のようなものはございますでしょうか?
結果が全てなのか、GPU等環境で差異があるのか気になる所です。