トップページ > 記事閲覧
DrawCircleなどのアンチエイリアス
名前:教えてくん 日時: 2016/04/02 02:29

いつもお世話になっています 単刀直入に申し上げますと、アンチエイリアスの効いた円や線を描画する機能がほしいです 単色や円の画像を作って描画する方法では、色を指定できない、拡大するとドットが見えるなどの欠点があるため DrawBox,DrawLine,DrawCircleなど図形描画関数にアンチエイリアスを指定できるようにしてほしいです 出来れば小数座標にも対応していただけると幸いです どうか検討していただけませんでしょうか?
メンテ

Page: 1 |

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

すみません、〜AAの関数を使用すると描画輝度が変化してしまうバグと、乗算済みアルファの ブレンドモードで正しい描画結果が得られないバグを修正したバージョンをアップしましたので、 お手数で申し訳ありませんがこちらをダウンロードしてください 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)」をして下さい) > もう一つ、この描画関数群と乗算済みアルファの相性が悪いのは仕方のないものなのでしょうか? いえ、仕方なくありません 今回実装したアンチエイリアス効果あり図形の描画には画像を使用しているのですが、その画像は 通常ブレンド用の画像だったので、今回乗算済みアルファのブレンドモードの場合は 乗算済みアルファの画像を使用するように処理を追加して正常な描画結果が得られるようにしました
メンテ
Re: DrawCircleなどのアンチエイリアス ( No.10 )
名前:教えてくん 日時:2016/04/24 15:36

修正ありがとうございます。正常な動作を確認できました。 美しい表示ができて幸甚です
メンテ
Re: DrawCircleなどのアンチエイリアス ( No.11 )
名前:教えてくん(解決) 日時:2016/04/24 15:48

解決を忘れていました
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存