トップページ > 記事閲覧
AA付き図形描画とブレンドモードの組み合わせによるバグ?
名前:教えてくん 日時: 2016/07/31 18:24

いつもお世話になっております 以前アンチエイリアス付きの図形描画を実装していただき、本当にありがとうございました 図形描画を多用しながらもきれいな描画ができるのでたいへん重宝しております さて、今回は描画モードを通常以外にした時、それらAA付きの関数群にいくつかのバグが発生するようでしたのでご報告させていただきます (発生条件が複雑なものもあり、正確に把握しきれていないかもしれません) ・描画モードをDX_BLENDMODE_MULにしてAA付きの描画をすると、AAが効かなくなり、一回り(2ピクセルほど)大きく描画される ・描画モードをDX_BLENDMODE_ADDにしてAA付きの描画をすると、その後の通常(AAのない)描画に指定した色に、AA描画の色が乗算される ・描画モードをDX_BLENDMODE_INVSRCにしてにしてAA付きの描画をすると、真っ黒で描画され、その後の通常(AAでない)描画の色に、AA付き描画の色が影響を与える (数回程度のテストでは具体的にどのような計算で影響が出ているかわかりませんでした) 乗算合成以外は自分のソフトで使っているわけではなかった(作業中に乗算合成のものに気が付いたのでいろいろテストして見つけた)のと、 自分のソフトでは通常描画やAAなしで代用したり、別のスクリーンに描画してからGrephBlendで合成したりして対応しているので 急ぎで対応していただきたいというわけではないのですが 利用する人が多い(管理人さんがほかの相談者に紹介するほどの)関数になっているようなので 中にはこれによって困ってしまう人も現れるのではないかと思ってご報告させていただいた次第です 実行環境は64bitWin10, IntelCOREi5, Intel HD Graphics 520です
メンテ

Page: 1 |

Re: AA付き図形描画とブレンドモードの組み合わせによるバグ? ( No.1 )
名前:管理人 日時:2016/08/01 02:55

不具合のご報告ありがとうございます m(_ _)m 全部は修正できませんでしたが、一部のバグは修正することができましたので、よろしければ こちらをお試しになってみてください 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)」をして下さい) > ・描画モードをDX_BLENDMODE_MULにしてAA付きの描画をすると、AAが効かなくなり、一回り(2ピクセルほど)大きく描画される 正常に乗算されるように修正しました > ・描画モードをDX_BLENDMODE_ADDにしてAA付きの描画をすると、その後の通常(AAのない)描画に指定した色に、AA描画の色が乗算される こちらは再現することができませんでした #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { ChangeWindowMode( TRUE ) ; if( DxLib_Init() < 0 ) return -1 ; SetDrawScreen( DX_SCREEN_BACK ) ; while( ProcessMessage() == 0 ) { ClearDrawScreen() ; // DX_BLENDMODE_ADD でアンチエイリアス付きの円を描画 SetDrawBlendMode( DX_BLENDMODE_ADD, 255 ) ; DrawCircleAA( 320.0f - 80.0f, 240.0f, 128.0f, 64, GetColor( 0,128,128 ), TRUE, 1.0f ) ; // DX_BLENDMODE_ALPHA でアンチエイリアスなしの円を描画 SetDrawBlendMode( DX_BLENDMODE_ALPHA, 255 ) ; DrawCircle( 320 + 80, 240, 128, GetColor( 255,255,0 ), TRUE ) ; ScreenFlip() ; } DxLib_End() ; return 0 ; } ↑このようなプログラムで AA付きの描画を行った後AAの無い描画を行ってみたのですが、 DrawCircle の描画結果に DrawCircleAA の実行が影響を与えることはありませんでした ( 普通に GetColor( 255,255,0 ) の色で円が描画されました ) よろしければ教えてくんさんの環境でも上記のプログラムであれば正常に動作するか試してみていただけないでしょうか m(_ _)m > ・描画モードをDX_BLENDMODE_INVSRCにしてにしてAA付きの描画をすると、真っ黒で描画され、その後の通常(AAでない)描画の色に、AA付き描画の色が影響を与える 「描画モードをDX_BLENDMODE_INVSRCにしてにしてAA付きの描画をすると、真っ黒で描画される」点については 修正できましたが、DX_BLENDMODE_ADD の件と同じく「その後の通常(AAでない)描画の色に、AA付き描画の色が影響を与える」に ついては再現することができませんでした DX_BLENDMODE_ADD とほぼ同じですが、以下のようなテストプログラムで再現を試みてみました #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { ChangeWindowMode( TRUE ) ; if( DxLib_Init() < 0 ) return -1 ; SetDrawScreen( DX_SCREEN_BACK ) ; while( ProcessMessage() == 0 ) { ClearDrawScreen() ; // DX_BLENDMODE_INVSRC でアンチエイリアス付きの円を描画 SetDrawBlendMode( DX_BLENDMODE_INVSRC, 255 ) ; DrawCircleAA( 320.0f - 80.0f, 240.0f, 128.0f, 64, GetColor( 0,128,128 ), TRUE, 1.0f ) ; // DX_BLENDMODE_ALPHA でアンチエイリアスなしの円を描画 SetDrawBlendMode( DX_BLENDMODE_ALPHA, 255 ) ; DrawCircle( 320 + 80, 240, 128, GetColor( 255,255,0 ), TRUE ) ; ScreenFlip() ; } DxLib_End() ; return 0 ; } 上記の再現用プログラムに問題がありましたらご指摘いただけないでしょうか? m(_ _;m
メンテ
Re: AA付き図形描画とブレンドモードの組み合わせによるバグ? ( No.2 )
名前:教えてくん(解決) 日時:2016/08/01 15:48

ご返信ありがとうございます 問題の修正を確認しました 色が変化する問題はライブラリのバージョンアップを怠っていたのが問題でした。。。 (私は.NETで作業しているのですが、DXライブラリのテスト用に作ったプロジェクトのDxLib.dllが、 以前実装していただいた時のDrawBrightnessが書き換えられてしまうというバージョンのものから変わっていませんでした。。) 現在のバージョンのものに差し替えたところ問題なく挙動したので、解決とさせていただきます
メンテ

Page: 1 |

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

   クッキー保存