Re: DrawCircleなどのアンチエイリアス ( No.1 ) |
- 名前:Nameless 日時:2016/04/02 09:26
SetDrawModeは試しましたか?
dxlib.o.oo7.jp/function/dxfunc_graph1.html#R3N16
|
Re: DrawCircleなどのアンチエイリアス ( No.2 ) |
- 名前:教えてくん 日時:2016/04/02 12:08
Namelessさん
それは、画像のドットが見えづらくなるという意味でしょうか?
手元で描画モードをバイリニアにしてDrawCircle等を試してみましたが、ジャギーは消えませんでした
バイリニアで拡大描画してもドットがぼやけるというだけで、無くなるわけではないので、
拡大率が大きくなるとやはり汚くなってしまいます
ミップマップの様に大小さまざまのものを用意すれば、画像でも綺麗に描画できると思いますが、
それでも色指定が難しい(DX_GRAPH_FILTER_HSBを使えば不可能ではない?)し、扱いも厄介になると思います
その他、SetFullSceneAntiAliasingModeを試してもシャギーは消えませんでした
描画サイズの2倍のスクリーンに一度描画してからDX_GRAPH_FILTER_DOWN_SCALEで縮小、
という方法も考えましたが、座標指定が厄介になったりする上に諧調数も対して多くない画像になったので、
せっかくならライブラリ側で綺麗な(ピクセルとの交差を計算した)アンチエイリアスを実装していただきたいと考えました
|
Re: DrawCircleなどのアンチエイリアス ( No.3 ) |
- 名前:管理人 日時:2016/04/03 12:50
実装を試してみようと思いますが、今週は時間が足りないので作業は次の週末となります
申し訳ありませんが少しお時間をください m(_ _;m
> せっかくならライブラリ側で綺麗な(ピクセルとの交差を計算した)アンチエイリアスを実装していただきたいと考えました
CPUで1ピクセルづつ計算したり、GPUのプログラマブルシェーダーを使ったりしない
ある意味擬似的な実装を考えていますので、もし教えてくんさんがCPUで1ピクセルづつ
正確に計算されたアンチエイリアス付き線分・円描画機能を期待されているのでしたら
恐らくご期待には添えないと思います…
|
Re: DrawCircleなどのアンチエイリアス ( No.4 ) |
- 名前:教えてくん 日時:2016/04/03 21:47
>実装を試してみようと思いますが、今週は時間が足りないので作業は次の週末となります
ありがとうございます! 実装してくれるというだけでありがたいです
>恐らくご期待には添えないと思います…
ある程度きれいな境界になっていれば
(シャギーが見えたり、ぼやけすぎたりしていなければ)
それで満足です
|
Re: DrawCircleなどのアンチエイリアス ( No.5 ) |
- 名前:管理人 日時:2016/04/11 03:28
すみません、この週末はあまり作業時間が確保できず、バグの修正を優先したので
こちらの作業はあまり進みませんでした
申し訳ありませんが次の週末までお待ちください m(_ _;m
|
Re: DrawCircleなどのアンチエイリアス ( No.6 ) |
- 名前:管理人 日時:2016/04/18 00:21
お待たせしました、アンチエイリアスの効いた円や線を描画する機能を追加したバージョンを
アップしましたので、よろしければこちらをダウンロードしてください m(_ _)m
https://dxlib.xsrv.jp/temp/DxLibVCTest.exe // VisualC++ 用
https://dxlib.xsrv.jp/temp/DxLibBCCTest.exe // BorlandC++ 用
https://dxlib.xsrv.jp/temp/DxLibGCC_DevCppTest.exe // Dev-C++ 用
https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.exe // MinGW 用
https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // .NET用
https://dxlib.xsrv.jp/temp/DxLibMakeTest.exe // ソース
(中身を既存のライブラリのファイルに上書きして、BCCをお使いの
場合は『再構築』を、VCをお使いの場合は『リビルド』を、
Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい)
以下の関数を追加しました
// 線を描画する( アンチエイリアス付き )
int DrawLineAA( float x1, float y1, float x2, float y2, unsigned int Color, float Thickness = 1.0f ) ;
// 四角形の描画する( アンチエイリアス付き )
int DrawBoxAA( float x1, float y1, float x2, float y2, unsigned int Color, int FillFlag, float LineThickness = 1.0f ) ;
// 円を描画する( アンチエイリアス付き )
int DrawCircleAA( float x, float y, float r, int posnum, unsigned int Color, int FillFlag = TRUE, float LineThickness = 1 ) ;
// 楕円を描画する( アンチエイリアス付き )
int DrawOvalAA( float x, float y, float rx, float ry, int posnum, unsigned int Color, int FillFlag, float LineThickness = 1 ) ;
// 三角形を描画する( アンチエイリアス付き )
int DrawTriangleAA( float x1, float y1, float x2, float y2, float x3, float y3, unsigned int Color, int FillFlag, float LineThickness = 1.0f ) ;
// 四角形を描画する( アンチエイリアス付き )
int DrawQuadrangleAA( float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4, unsigned int Color, int FillFlag, float LineThickness = 1.0f ) ;
アンチエイリアス処理を加えた図形描画はアンチエイリアス無しの描画関数とはアルゴリズムが異なるので
描画結果の位置に±1ピクセルほどのずれがありますのでご注意ください
あと、DrawCircleAA と DrawOvalAA の引数 posnum は円を形成する頂点の数です
DrawCircle と DrawOval はピクセル単位で円を描いているのですが、DrawCircleAA と DrawOvalAA は
多角形で円を描いていて、正確には円ではなくただの多角形です
posnum の値を大きくすればするほど綺麗な円に近づきますが、posnum の値が大きくなるほど描画負荷は
高くなりますので、クオリティと負荷のバランスを考えて posnum の値を決定してください
Thickness, LineThickness はそれぞれ線や中身の塗りつぶし無しの円や三角形を描画した際の線の太さです
最小は 1.0f で、1.0f 以下の値を指定しても 1.0f とみなされます
1.0f 以下の値の場合と 1.0f より大きい値の場合とでは内部の処理が異なり、描画負荷は 1.0f 以下の値を
指定した場合の方が軽くなっています
よろしければお使いください m(_ _)m
|
Re: DrawCircleなどのアンチエイリアス ( No.7 ) |
- 名前:教えてくん 日時:2016/04/21 21:38
お忙しい中、実装ありがとうございました。
しかし、バグと思われる現象が発生しています。
調べてみたところ、今回実装いただいた〜AAの関数を使用すると描画輝度に描画色が乗算されてしまうようです。
(以下再現用C#ソース(抜粋)、スクリーンショットを参考)
確認出来ましたら修正お願い致します
ttp://i.imgur.com/PY1TdMv.png
static void Main(string[] args)
{
//640*480のウィンドウモードで起動
DX.ChangeWindowMode(1);
DX.SetGraphMode(640, 480, 32);
//ライブラリ初期化
if (DX.DxLib_Init() == -1) return;
//描画輝度代入用変数
int r, g, b;
//描画輝度を求める
DX.GetDrawBright(out r, out g, out b);
//四角を表示
DX.DrawBox(50, 50, 80, 70, DX.GetColor(255, 255, 255), 1);
//デバッグ文字を表示
DX.DrawString(90, 50, "AA描画前の描画輝度 R:" + r.ToString() + " G:" + g.ToString() + " B:" + b.ToString(), DX.GetColor(255, 255, 255));
//画面中心にアンチエイリアスの効いた円を描画する
DX.DrawCircleAA(320, 240, 100, 32, DX.GetColor(100, 255, 255));
DX.DrawCircleAA(320, 240, 100, 32, DX.GetColor(100, 255, 255));
//描画輝度を求めなおす
DX.DrawBox(50, 80, 80, 100, DX.GetColor(255, 255, 255), 1);
//四角を表示
DX.GetDrawBright(out r, out g, out b);
//デバッグ文字を表示
DX.DrawString(90, 80, "AA描画後の描画輝度 R:" + r.ToString() + " G:" + g.ToString() + " B:" + b.ToString(), DX.GetColor(255, 255, 255));
//キー入力を待つ
DX.WaitKey();
//終了
DX.DxLib_End();
}
|
Re: DrawCircleなどのアンチエイリアス ( No.8 ) |
- 名前:教えてくん 日時:2016/04/21 22:54
もう一つ、この描画関数群と乗算済みアルファの相性が悪いのは仕方のないものなのでしょうか?
合成モードを乗算済みアルファに指定して描画すると、
AAによって半透明になった部分がシャギーとなったり、明るくなったりしてしまいます
(RGBにAが乗算されていないゆえ?)
もしできるのならば、乗算済みアルファに対応していただきたいのですが。。
|
Re: DrawCircleなどのアンチエイリアス ( No.9 ) |
- 名前:管理人 日時:2016/04/24 02:45
|
Re: DrawCircleなどのアンチエイリアス ( No.10 ) |
- 名前:教えてくん 日時:2016/04/24 15:36
修正ありがとうございます。正常な動作を確認できました。
美しい表示ができて幸甚です
|
Re: DrawCircleなどのアンチエイリアス ( No.11 ) |
- 名前:教えてくん(解決) 日時:2016/04/24 15:48
解決を忘れていました
|
|