トップページ > 記事閲覧
PCによって表示が変わる
名前:たろう 日時: 2016/09/16 03:19

いつもおせわになっております。たろうです 画像を読み込んだあと、GraphFilterや、DrawBlendGraph( 0,0, img, TRUE, msk, 128,255 ) ; などで画像を合成した上で使ったりしているのですが、 起動するPCによって画像の周りに白い縁が出来たり、色が変わったりする事がわかりました。 ※4台中、古めの2台(win8,win7)で正しく表示されません。 これを避けるため、一度正しい表示のされるPCで加工した画像をファイルとして外に保存してから、 ゲームを配布するときは加工済みのファイルを読み込むようにしたいと思い、 下のような関数を作りました int 画RW(int *画,int 場1,int 場2) { TCHAR パス[PATH_LENGTH]; _stprintf(パス,_T("img/%d/%d.png") ,場1,場2); *画=LoadGraph( パス ) ;if(*画==-1){return 1;}return 0; } void 画RW(int 画,int 場1,int 場2) { TCHAR パス[PATH_LENGTH]; _stprintf(パス,_T("img/%d/%d.png") ,場1,場2); int 出画,縦,横; GetGraphSize( 画,&横,&縦 ); 出画=MakeScreen( 横,縦,TRUE); SetDrawScreen(出画); DrawGraph( 0, 0, 画, TRUE); SaveDrawScreenToPNG(0, 0, 横, 縦, パス, 0); SetDrawScreen( DX_SCREEN_BACK ); return; } それを以下のように画像ファイルが無いときだけPNGで書きだします。 if(画RW(&画,0,i)){ 画 = LoadGraph( fパス[0][i] );画像加工の関数(&画);画RW(画,0,i); } これで次に読むときには「画像加工の関数」を通らずに 加工済みの画像が使われるようになるというものです。 ただここで問題がありまして、SaveDrawScreenToPNGで作成されたファイルは、 これはPNGの仕様だとは思いますが、透明部分のある画像の縁部分に 圧縮の値にかかわりなくやや黒っぽい縁が出来てしまいます。 上記「画RW(int 画」に入れる前の画像をそのままプログラム上で使えば黒い縁はありません。 それですっかり詰んでしまったので、すみませんが質問、要望をお許し下さい。 @GraphFilterや、DrawBlendGraphを使用した画像が、正しく表示される最低条件が分かればそれを 配布の際の動作条件に入れたいと思います。どのような文言を入れたらよいでしょうか? 知識が足りず、もうしわけありません。教えていただけると助かります。 A画像ハンドルにあるMakeScreenで作った画像を、そのまま外部に保存して、 それをDXライブラリで読み込むような仕組みは出来ませんでしょうか? DXライブラリ以外で読み込めなくても問題ありません。 ※もしくは黒っぽい縁の出来ないPNG出力が可能であればそれでも問題ありません。 お忙しいところ恐れいりますが、よろしくお願い致します。
メンテ

Page: 1 |

Re: PCによって表示が変わる ( No.1 )
名前:管理人 日時:2016/09/19 12:15

> @GraphFilterや、DrawBlendGraphを使用した画像が、正しく表示される最低条件が分かればそれを > 配布の際の動作条件に入れたいと思います。どのような文言を入れたらよいでしょうか? GraphFilter はグラフィックスデバイスが PixelShader 2.0 に対応している必要があります DrawBlendGraph はグラフィックスデバイスが Direct3D 7 に対応している必要があります win8 や win7 が動作するPCではどちらも対応しているはずなので、詳しく調べることができれば お試しになった「古めの2台」でも正常に表示できるようにすることができると思いますが… (・・; > A画像ハンドルにあるMakeScreenで作った画像を、そのまま外部に保存して、 > それをDXライブラリで読み込むような仕組みは出来ませんでしょうか? 透明部分が黒っぽくなってしまう現象は PNG の仕様とは関係ありません、MakeScreen で作成した 「描画対象にできるグラフィックハンドル」に対して透明要素を含んだ画像をそのまま DrawGraph で 描画した場合、「描画対象にできるグラフィックハンドル」に保存されている画像の内容は DrawGraph で描画した画像と同じものにはなりません 詳しくはこちらの「乗算済みアルファのすすめ」をください m(_ _)m < 乗算済みアルファのすすめ > https://dxlib.xsrv.jp/lecture/PremulAlpha/PremulAlpha.html 要は MakeScreen で作成した「描画対象にできるグラフィックハンドル」に保存されるピクセルの アルファ値( 不透明度 )が DrawGraph で描画した画像と異なってしまうからなので、DrawGraph で 描画した画像と全く同じアルファ値にする場合は、事前に SetDrawBlendMode でブレンドモードを 「描画元の色をそのまま描画先に書き込む」モードである DX_BLENDMODE_SRCCOLOR に変更する必要があります SetDrawBlendMode( DX_BLENDMODE_SRCCOLOR, 255 ) ; なので、プログラムは以下のようになります( 改行を入れました ) void 画RW(int 画,int 場1,int 場2) { TCHAR パス[PATH_LENGTH]; _stprintf(パス,_T("img/%d/%d.png") ,場1,場2); int 出画,縦,横; GetGraphSize( 画,&横,&縦 ); 出画=MakeScreen( 横,縦,TRUE); SetDrawScreen(出画); // ブレンドモードを DX_BLENDMODE_SRCCOLOR に変更 SetDrawBlendMode( DX_BLENDMODE_SRCCOLOR, 255 ) ; DrawGraph( 0, 0, 画, TRUE); // ブレンドモードをデフォルトの DX_BLENDMODE_NOBLEND に変更 SetDrawBlendMode( DX_BLENDMODE_NOBLEND, 255 ) ; SaveDrawScreenToPNG(0, 0, 横, 縦, パス, 0); SetDrawScreen( DX_SCREEN_BACK ); return; } よろしければお試しください m(_ _)m
メンテ
Re: PCによって表示が変わる ( No.2 )
名前:たろう 日時:2016/09/19 18:46

いつもありがとうございます。たろうです。 @につきましては、実は古いパソコン2台のwin8のほうのテストは一年以上前に行ったもので、 その時GraphFilterを掛けると色が変になるというものでした。当時も他のPCでは正常でしたが PCによって異常が出るというのでは困るので、使用をやめた経緯もあり現在個人的には不自由はありません。 そのときにかけたフィルタの詳細は忘れてしまったのですが、確かDX_GRAPH_FILTER_HSBで 実はもう一度、どのように変になるか細かくテストしようとしましたが 起動するだけでフリーズしてしまい、テストもできない状態でした^^; またフリーズは、タブレットPCなので性能が悪のと、最近故障気味なためだと思っています。 win7のほうは今回発見したもので白い縁が出来ます。縁というか半透明部分が全部白くなる感じです。 ゲーム中にもMakeScreenで作った画像にMakeScreenで作った画像を貼り付けるような場面があるため、 例えAが解決されても問題が残ってしまうので何か解決法があるといいのですが、、、 ただ、乗算済みアルファの理解が不十分だったため、プログラムの間違いから エラーのような事が起きているかもしれません。もう一度良く調べてみます。 Aですが、頂いた関数に変更して実行してみましたが、改善されませんでした。 void 画RW(int 画,int 場1,int 場2) { TCHAR パス[PATH_LENGTH]; _stprintf(パス,_T("img/%d/%d.png") ,場1,場2); int 出画,縦,横; GetGraphSize( 画,&横,&縦 ); 出画=MakeScreen( 横,縦,TRUE); SetDrawScreen(出画); // ブレンドモードを DX_BLENDMODE_SRCCOLOR に変更 SetDrawBlendMode( DX_BLENDMODE_SRCCOLOR, 255 ) ; DrawGraph( 0, 0, 画, TRUE); // ブレンドモードをデフォルトの DX_BLENDMODE_NOBLEND に変更 SetDrawBlendMode( DX_BLENDMODE_NOBLEND, 255 ) ; SaveDrawScreenToPNG(0, 0, 横, 縦, パス, 0); SetDrawScreen( DX_SCREEN_BACK ); return; } ↑これを SetUsePremulAlphaConvertLoad( TRUE ) ;画= LoadGraph(パス);画RW(画,0,i); ↑のようにSetUsePremulAlphaConvertLoad( TRUE )の直後に画像読み込みして、即「画RW」に移動しても 黒い縁が出てしまい、とくに変化は無いようです。 以上です。お忙しいところすみません、 引き続きアドバイスをいただけると助かります。よろしくお願いいたします。
メンテ
Re: PCによって表示が変わる ( No.3 )
名前:管理人 日時:2016/09/20 00:28

> Aですが、頂いた関数に変更して実行してみましたが、改善されませんでした。 うーん、謎ですね… 手元で以下のようなプログラムを組んで、読み込んだ AlphaTest.png と、SaveDrawScreen で保存した AlphaTestScreenSave.png を見比べて異なる画像( 透明部分が黒い画像 )になってしまうか確認してみたのですが、 問題なく AlphaTest.png と AlphaTestScreenSave.png は全く同じ画像となっていました #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int Screen ; int GrHandle ; int SizeX, SizeY ; // ウインドウモードで起動 ChangeWindowMode( TRUE ); // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1; // 画像の読み込み GrHandle = LoadGraph( "AlphaTest.png" ) ; // 読み込みに成功した場合のみ処理を実行 if( GrHandle >= 0 ) { // 画像のサイズを取得 GetGraphSize( GrHandle, &SizeX, &SizeY ) ; // MakeScreen で画像のサイズと同じサイズのアルファチャンネル付きの「描画対象にできる画像」を作成 Screen = MakeScreen( SizeX, SizeY, TRUE ) ; // 描画先を「描画対象にできる画像」に変更 SetDrawScreen( Screen ) ; // ブレンドモードを「描画する画像の色をそのまま書き込む」モードに変更 SetDrawBlendMode( DX_BLENDMODE_SRCCOLOR, 255 ) ; // 読み込んだ画像を描画 DrawGraph( 0, 0, GrHandle, TRUE ) ; // ブレンドモードをデフォルトのものに戻す SetDrawBlendMode( DX_BLENDMODE_NOBLEND, 255 ) ; // 「描画対象にできる画像」の内容を保存 SaveDrawScreenToPNG( 0, 0, SizeX, SizeY, "AlphaTestScreenSave.png" ) ; } // DXライブラリの後始末 DxLib_End(); // ソフトの終了 return 0; } よろしければ上記のプログラムの「AlphaTest.png」の部分をたろうさんのお手元にある画像に変更して、 実行した際に作成される「AlphaTestScreenSave.png」が読み込んだ画像と同じものになるか お試しになってみていただけないでしょうか? 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)」をして下さい)
メンテ
Re: PCによって表示が変わる ( No.4 )
名前:たろう 日時:2016/09/20 02:09

たろうです。いつもありがとうございます。 頂いたコードを試した所、問題なく縁のない画像が排出されました。 それで、原因を探してみたのですがLoadGraphの前に SetUsePremulAlphaConvertLoad( TRUE ) ;を入れると黒い縁が出ることがわかりました。 // 画像の読み込み SetUsePremulAlphaConvertLoad( TRUE ) ;//←これをここに入れます GrHandle = LoadGraph( "AlphaTest.png" ) ; ただ、これだと私の一番初めの投稿の「画像加工の関数(&画)」に当たる部分で SetUsePremulAlphaConvertLoad( TRUE ) の後に読み込んだ画像をMakeScreenで作った(布)に何枚か重ねて描画して、 それを同じく読んだ別のアルファ値を含む画像(mask)の形でくり抜くための DrawBlendGraph( 0,0, 布, TRUE, mask, 128,255 ) ; ↑のような処理をする部分があるために、画像ロード前にSetUsePremulAlphaConvertLoad( FALSE ) ;にしてしまうと 変な画像になってしまうので、改善策としては私のプログラムでは使えない状況です。 「画像加工の関数(&画)」のあとでSetUsePremulAlphaConvertLoad( FALSE ) ;としても、当たり前かもしれませんが 黒い縁が出てしまいます。PNGを書き出す直前で、SetUsePremulAlphaConvertLoad( FALSE ) ;として読み込んだ画像の様に 変更するなどの方法はありますでしょうか? 度々すみません。よろしくお願いいたします。
メンテ
Re: PCによって表示が変わる ( No.5 )
名前:管理人 日時:2016/09/20 22:08

うーん、状況が複雑ですね… お手数で申し訳ないのですが 『SetUsePremulAlphaConvertLoad( TRUE ) の後に読み込んだ画像をMakeScreenで作った(布)に何枚か重ねて描画して、 それを同じく読んだ別のアルファ値を含む画像(mask)の形でくり抜くための DrawBlendGraph( 0,0, 布, TRUE, mask, 128,255 ) ; ↑のような処理』 こちらの処理を行い、最後にそれを PNGファイルに保存するという処理のみを抜き出した テストプログラムをいただけないでしょうか? 実際のプログラムを拝見できれば解決策が見出せると思いますので… m(_ _;m > それで、原因を探してみたのですがLoadGraphの前に > SetUsePremulAlphaConvertLoad( TRUE ) ;を入れると黒い縁が出ることがわかりました。 LoadGraph の前に SetUsePremulAlphaConvertLoad( TRUE ) ; を実行すると、LoadGraph で読み込まれる画像は 『乗算済みアルファ』の画像となります、そして『乗算済みアルファ』の画像を通常のビューアーで見ると 半透明の部分が黒くなるので、その結果は正常です > 「画像加工の関数(&画)」のあとでSetUsePremulAlphaConvertLoad( FALSE ) ;としても、当たり前かもしれませんが > 黒い縁が出てしまいます。PNGを書き出す直前で、SetUsePremulAlphaConvertLoad( FALSE ) ;として読み込んだ画像の様に > 変更するなどの方法はありますでしょうか? 確認なのですが、本件のご質問をされる時点で『SetUsePremulAlphaConvertLoad( TRUE )』や 『SetDrawBlendMode( DX_BLENDMODE_PMA_ALPHA, 255 )』などを使用する『乗算済みアルファ』の機能を 使用されていた、という認識で問題ないでしょうか? 仮にそうである前提でお話させていただきますと、先ほど申し上げました通り 「『乗算済みアルファ』の画像は通常の画像ビューアーなどで見ると半透明の部分は黒くなる」 ので、たろうさんのプログラムでSaveDrawScreenToPNGによって作成された 『透明部分のある画像の縁部分にやや黒っぽい縁が出来てしまいます』というPNG画像は正しい画像である可能性があります そして、SaveDrawScreenToPNGによって作成されたPNG画像は既に『乗算済みアルファ』の画像なので、もしその画像を読み込む際に SetUsePremulAlphaConvertLoad( TRUE ) が実行されていると「既に『乗算済みアルファ』となっている画像に対して、更に 『乗算済みアルファ』の処理を行ってしまっている」ことになりますので、読み込まれた画像は 『乗算済みアルファの処理が2重に行われた不正な画像』となってしまいます なので、SaveDrawScreenToPNGによって作成されたPNG画像を読み込む前に SetUsePremulAlphaConvertLoad( FALSE ) を実行すれば、 もしかしたら正常な描画結果を得ることができるかもしれません とはいえ、この予想は外れている可能性も高いので、確実に原因を特定するには、やはりたろうさんにテストプログラムを 組んでいただく必要があります m(_ _;m
メンテ
Re: PCによって表示が変わる ( No.6 )
名前:たろう(修正) 日時:2016/09/21 02:32

たろうです。いつもありがとうございます。 『乗算済みアルファ』の機能は、以前から使用させていただいていますm(_ _)m 管理人さんの予想通りSaveDrawScreenToPNGによって作成された黒い縁が出来たPNG画像を SetUsePremulAlphaConvertLoad( FALSE ) ;の後に読み込んだら、正常な画像として表示されました。 一点質問させて下さい。この方法は例えば「私のPC」で実行したプログラムから 「SaveDrawScreenToPNGによって作成された黒い縁が出来たPNG画像(乗算済みアルファ画像)」を作成して、 「他のPC」(ゲームを遊ぶ人の)でSetUsePremulAlphaConvertLoad( FALSE )として読み込んだ時も 「私のPC」でSetUsePremulAlphaConvertLoad( FALSE )として読み込んだ時と同じように、 黒い縁が出来ないと考えてもよろしいでしょうか? つまり乗算済みアルファ画像がどういったものかというのは、例えばPCそれぞれのGPUやDirectXのバージョンなどに依存して 変わってしまう類のものではなく、普通のPNG画像を読み込む場合と同じように環境によって結果が ほとんど左右されないような仕様と考えてよろしいでしょうか? そうでないと、やはり乗算済みアルファではないPNG画像としてPNG画像を外部に作成出来ないと 環境によって表示がおかしくなる事になってしまうので、、、 すみません、知識が足りずアホなことを聞いているかもしれませんが、よろしくお願いいたします。 一応テストプログラムも作りましたので、必要なくなってしまったかとは思いますが、 どういう処理をしているのかという参考程度に、以下に貼り付けます。 よろしくお願いいたします。 ※よろしければ以下でDXlibの正しくない使用方法などがありましたらお知らせいただけると助かりますm(_ _)m #include "DxLib.h" #define FMfor(値) for(int i=0;i<値;i++) #define FM初(文) static int 初=1;if(初){初=0;文} int 模様; int 色幕( int X幅,int Y幅,int 色,int 透明=50 ) { int 画 = MakeScreen( X幅,Y幅,TRUE); SetDrawScreen(画); SetDrawBlendMode(DX_BLENDMODE_PMA_ALPHA,透明); DrawBox( 0,0,X幅,Y幅,色,TRUE ); SetDrawBlendMode(DX_BLENDMODE_PMA_ALPHA,255); SetDrawScreen( DX_SCREEN_BACK ); return 画; } int 複製画(int 画1) { if(画1 <=0)return 0; int SizeX, SizeY,完; GetGraphSize( 画1 , &SizeX , &SizeY ) ; 完 = MakeScreen( SizeX, SizeY, TRUE); SetDrawScreen( 完 ) ; DrawGraph( 0, 0 , 画1 , TRUE); SetDrawScreen( DX_SCREEN_BACK ); return 完; } void 画像加工の関数( int *画, double 模EX=1 ,int 模程度=255) { if(*画 <=0)return; int SizeX, SizeY, 模s_x, 模s_y; int 完, 布, 色,mask; int 色程度=205,青=-20,赤=7,白=20; static int 白幕; FM初 ( 白幕 = 色幕(100,100,GetColor(255,255,255),255); 模様 = LoadGraph( "texture.png" ) ; ) GetGraphSize( *画 , &SizeX , &SizeY ); GetGraphSize( 模様 , &模s_x , &模s_y ); 色 = MakeScreen( SizeX,SizeY, TRUE); 布 = MakeScreen( SizeX,SizeY, TRUE); 完 = MakeScreen( SizeX,SizeY, TRUE); mask= 複製画(*画); GraphFilterBlt( *画, 色, DX_GRAPH_FILTER_MONO, 青, 赤 ) ; GraphFilter( *画, DX_GRAPH_FILTER_HSB, 0, 0, 250, 0 ) ; SetDrawScreen( 布 ) ;ClearDrawScreen(); DrawGraph( 0, 0,*画, TRUE); SetDrawBlendMode( DX_BLENDMODE_PMA_ALPHA, 色程度); DrawGraph( 0, 0, 色, TRUE); SetDrawBlendMode( DX_BLENDMODE_PMA_ALPHA, 255); if(白>0) { SetDrawBlendMode(DX_BLENDMODE_PMA_ALPHA,白); for(int ii=0;ii<20;ii++) { if(ii*100<SizeX){FMfor(20){if(i*100<SizeY){DrawGraph( ii*100, i*100, 白幕, TRUE);}}} } SetDrawBlendMode( DX_BLENDMODE_PMA_ALPHA, 255); } FMfor(5) if(模程度>0) { if(模程度>255){SetDrawBlendMode( DX_BLENDMODE_PMA_ALPHA, 255);} else {SetDrawBlendMode( DX_BLENDMODE_PMA_ALPHA, 模程度);} for(int ii=0;ii<20;ii++) { if(ii*(模s_y*模EX)<SizeY) { FMfor(20) { if(i*(模s_x*模EX)<SizeX) { DrawRotaGraph2( i*(模s_x*模EX), ii*(模s_y*模EX), 0,0 ,模EX,0, 模様 , TRUE, FALSE); }else{break;} } }else{break;} } 模程度-=255; } SetDrawBlendMode( DX_BLENDMODE_PMA_ALPHA, 255); SetDrawScreen( 完 ) ;ClearDrawScreen(); DrawBlendGraph( 0,0, 布, TRUE, mask, 128,255 ) ;//SetDrawBlendMode( 0,0, 布, TRUE, mask, 128,255 ) ; SetDrawScreen( DX_SCREEN_BACK ); DeleteGraph(色); DeleteGraph(布); DeleteGraph(mask); DeleteGraph(*画); *画=完; return; } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int Screen ; int GrHandle ; int SizeX, SizeY ; ChangeWindowMode( TRUE ); if( DxLib_Init() < 0 ) return -1; // 画像の読み込み SetUsePremulAlphaConvertLoad( TRUE ) ; GrHandle = LoadGraph( "AlphaTest.png" ) ; 画像加工の関数(&GrHandle ,1.18 ,255); // 読み込みに成功した場合のみ処理を実行 if( GrHandle >= 0 ) { GetGraphSize( GrHandle, &SizeX, &SizeY ) ; Screen = MakeScreen( SizeX, SizeY, TRUE ) ; SetDrawScreen( Screen ) ; SetDrawBlendMode( DX_BLENDMODE_SRCCOLOR, 255 ) ; DrawGraph( 0, 0, GrHandle, TRUE ) ; SetDrawBlendMode( DX_BLENDMODE_NOBLEND, 255 ) ; SaveDrawScreenToPNG( 0, 0, SizeX, SizeY, "AlphaTestScreenSave.png" ) ; } DxLib_End(); return 0; }
メンテ
Re: PCによって表示が変わる ( No.7 )
名前:たろう 日時:2016/09/21 17:55

たろうです。いつもありがとうございます。 乗算済みアルファを通常に戻す設定を見つけたのですが、 GraphFilter( 画, DX_GRAPH_FILTER_INTERP_ALPHA) ; ↑これを使った所、普通のPNGとしてファイルを作成出来ることがわかりました。 コレで問題なさそうです。お騒がせいたしました。 すみません、お手すきのときで構いません、追加の質問をお許し下さい。 @の件に関連することなのですが 乗算済みアルファ画像「画1」を、同じく「画2」の不透明部分の形で切り抜く際、 ↓のようにすると GraphBlend( 画1, 画2, 255, DX_GRAPH_BLEND_RGBA_SELECT_MIX, DX_RGBA_SELECT_SRC_R, DX_RGBA_SELECT_SRC_G, DX_RGBA_SELECT_SRC_B, DX_RGBA_SELECT_BLEND_A ) ; 白い縁が出てしまい、その原因が謎だったのですが、 乗算済みアルファ画像は半透明部分が変更されてしまっているために 画2のアルファ値が変なことになっているというのが原因と考えてよろしいでしょうか? それで、今まで仕方なくよくわからずに、上記目的の効果が何故か得られる DrawBlendGraph( 0, 0, 画1, TRUE, 画2, 128, 255 ) ;というものでお茶を濁していたのですが @の件のPCによって白い縁が出てしまうケースでコレを経由している事もあり。 できればDX_GRAPH_BLEND_RGBA_SELECT_MIXを使って乗算済みアルファ画像同士の切り抜きができれば スッキリします。 DX_GRAPH_FILTER_PREMUL_ALPHAを両方の画像にかけてから合成を行い またそれを表示するためにDX_GRAPH_FILTER_INTERP_ALPHAにもどすということでも良さそうですが、 ゲーム中にリアルタイムにそれをいくつも行う事があるので、かなり遠回りな気がします。 なにかアドバイスを頂けますでしょうか? お忙しいところ申し訳ございません。よろしくお願いいたします。
メンテ
Re: PCによって表示が変わる ( No.8 )
名前:管理人 日時:2016/09/23 02:39

> 一点質問させて下さい。この方法は例えば「私のPC」で実行したプログラムから > 「SaveDrawScreenToPNGによって作成された黒い縁が出来たPNG画像(乗算済みアルファ画像)」を作成して、 > 「他のPC」(ゲームを遊ぶ人の)でSetUsePremulAlphaConvertLoad( FALSE )として読み込んだ時も > 「私のPC」でSetUsePremulAlphaConvertLoad( FALSE )として読み込んだ時と同じように、 > 黒い縁が出来ないと考えてもよろしいでしょうか? はい > つまり乗算済みアルファ画像がどういったものかというのは、例えばPCそれぞれのGPUやDirectXのバージョンなどに依存して > 変わってしまう類のものではなく、普通のPNG画像を読み込む場合と同じように環境によって結果が > ほとんど左右されないような仕様と考えてよろしいでしょうか? はい、乗算済みアルファの画像や処理はOSやハードによって差異が発生する処理ではありませんので、 どんな環境でも同じ結果が得られます ( 『乗算済みアルファ』の画像は、アルファの値をRGBの値に乗算しただけのものですので ) > ※よろしければ以下でDXlibの正しくない使用方法などがありましたらお知らせいただけると助かりますm(_ _)m > @の件に関連することなのですが > 乗算済みアルファ画像「画1」を、同じく「画2」の不透明部分の形で切り抜く際、 > ↓のようにすると > 白い縁が出てしまい、その原因が謎だったのですが、 > 乗算済みアルファ画像は半透明部分が変更されてしまっているために > 画2のアルファ値が変なことになっているというのが原因と考えてよろしいでしょうか? > できればDX_GRAPH_BLEND_RGBA_SELECT_MIXを使って乗算済みアルファ画像同士の切り抜きができれば > スッキリします。 > DX_GRAPH_FILTER_PREMUL_ALPHAを両方の画像にかけてから合成を行い > またそれを表示するためにDX_GRAPH_FILTER_INTERP_ALPHAにもどすということでも良さそうですが、 > ゲーム中にリアルタイムにそれをいくつも行う事があるので、かなり遠回りな気がします。 > なにかアドバイスを頂けますでしょうか? 『乗算済みアルファ』の画像を使用する場合は GraphBlend や GraphFilter も『乗算済みアルファ』に対応したものを 使用する必要があります、ただ、今まで『乗算済みアルファ』用のフィルター機能・ブレンド機能が無かったので、 今回新たに追加しました よろしければこちらをダウンロードしてください 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_GRAPH_FILTER_PMA_BRIGHT_CLIP // 明るさクリップフィルタ(乗算済みアルファ画像用) DX_GRAPH_FILTER_PMA_BRIGHT_SCALE // 指定の明るさ領域を拡大するフィルタ(乗算済みアルファ画像用) DX_GRAPH_FILTER_PMA_HSB // 色相・彩度・明度フィルタ(乗算済みアルファ画像用) DX_GRAPH_FILTER_PMA_INVERT // 階調の反転フィルタ(乗算済みアルファ画像用) DX_GRAPH_FILTER_PMA_LEVEL // レベル補正フィルタ(乗算済みアルファ画像用) DX_GRAPH_FILTER_PMA_TWO_COLOR // 2階調化フィルタ(乗算済みアルファ画像用) DX_GRAPH_FILTER_PMA_GRADIENT_MAP // グラデーションマップフィルタ(乗算済みアルファ画像用) DX_GRAPH_BLEND_PMA_NORMAL // 通常( 乗算済みα画像用 ) DX_GRAPH_BLEND_PMA_RGBA_SELECT_MIX // RGBAの要素を選択して合成( 乗算済みα画像用 ) DX_GRAPH_BLEND_PMA_MULTIPLE // 乗算( 乗算済みα画像用 ) DX_GRAPH_BLEND_PMA_DIFFERENCE // 減算( 乗算済みα画像用 ) DX_GRAPH_BLEND_PMA_ADD // 加算( 乗算済みα画像用 ) DX_GRAPH_BLEND_PMA_SCREEN // スクリーン( 乗算済みα画像用 ) DX_GRAPH_BLEND_PMA_OVERLAY // オーバーレイ( 乗算済みα画像用 ) DX_GRAPH_BLEND_PMA_DODGE // 覆い焼き( 乗算済みα画像用 ) DX_GRAPH_BLEND_PMA_BURN // 焼き込み( 乗算済みα画像用 ) DX_GRAPH_BLEND_PMA_DARKEN // 比較(暗)( 乗算済みα画像用 ) DX_GRAPH_BLEND_PMA_LIGHTEN // 比較(明)( 乗算済みα画像用 ) DX_GRAPH_BLEND_PMA_SOFTLIGHT // ソフトライト( 乗算済みα画像用 ) DX_GRAPH_BLEND_PMA_HARDLIGHT // ハードライト( 乗算済みα画像用 ) DX_GRAPH_BLEND_PMA_EXCLUSION // 除外( 乗算済みα画像用 ) DX_GRAPH_BLEND_PMA_NORMAL_ALPHACH // αチャンネル付き画像の通常合成( 乗算済みα画像用 ) DX_GRAPH_BLEND_PMA_ADD_ALPHACH // αチャンネル付き画像の加算合成( 乗算済みα画像用 ) DX_GRAPH_BLEND_PMA_MULTIPLE_A_ONLY // アルファチャンネルのみの乗算( 乗算済みα画像用 ) DX_GRAPH_BLEND_RGBA_SELECT_MIX の代わりに DX_GRAPH_BLEND_PMA_RGBA_SELECT_MIX を使用してください あと、載せていただいたプログラムでは DX_GRAPH_FILTER_HSB を使用されていますが、こちらも代わりに DX_GRAPH_FILTER_PMA_HSB を使用するようにしてください m(_ _)m
メンテ
Re: PCによって表示が変わる ( No.9 )
名前:たろう(解決) 日時:2016/09/23 05:12

たろうです。いつもすみません。 乗算済みアルファ対応のフィルタ関連の関数を用意していただきありがとうございますm(_ _)m 使用して万一問題があればまたここで報告させていただきます。 お忙しいところありがとうございました。
メンテ
Re: PCによって表示が変わる ( No.10 )
名前:たろう 日時:2016/09/23 07:47

お世話になっております。たろうです。 蒸し返してしまいすみません。 早速、DX_GRAPH_BLEND_PMA_RGBA_SELECT_MIXを使用させていただきましたが。希望通りの動作が得られました。 GraphBlend( 画1, 画2, 255, DX_GRAPH_BLEND_PMA_RGBA_SELECT_MIX, DX_RGBA_SELECT_SRC_R, DX_RGBA_SELECT_SRC_G, DX_RGBA_SELECT_SRC_B, DX_RGBA_SELECT_BLEND_A ) ; ↑ような設定で画1を画2の不透明部分の形で切り抜くために使用しているのですが、 画1が半透明の画像の場合に、その半透明を活かしつつ画2の形で切り抜くような、 DX_RGBA_SELECT_SRC_A と DX_RGBA_SELECT_BLEND_A の両方の透明部分を生かすような設定は難しいでしょうか? もし、可能であればいつでも構いません、お手すきの時に、実装していただけるとうれしいです。 すみません。よろしくおねがいたします。
メンテ
Re: PCによって表示が変わる ( No.11 )
名前:管理人 日時:2016/09/25 02:34

それでしたら以前から存在する DX_GRAPH_BLEND_PMA_MULTIPLE_A_ONLY が該当すると思います // アルファチャンネルのみの乗算( 乗算済みα画像用 ) DX_GRAPH_BLEND_PMA_MULTIPLE_A_ONLY よろしければお試しください m(_ _)m
メンテ
Re: PCによって表示が変わる ( No.12 )
名前:たろう 日時:2016/09/25 05:19

たろうです。すみません確認がたりず、 DX_GRAPH_BLEND_PMA_MULTIPLE_A_ONLY の存在に気づきませんでしたm(_ _)m 試してみたのですが、DX_GRAPH_BLEND_PMA_MULTIPLE_A_ONLYを使用すると、 プログラムが強制終了してしまいます。 DX_GRAPH_BLEND_MULTIPLE_A_ONLYにすると 乗算済みアルファ画像を使っているので、白い縁が出来てしまいますが、 それ以外は問題なく切り抜きが出来ますので、なにかバグがあるのではないでしょうか? だめ→ GraphBlend( 画1, 画2, 255, DX_GRAPH_BLEND_PMA_MULTIPLE_A_ONLY ) ; OK→ GraphBlend( 画1, 画2, 255, DX_GRAPH_BLEND_MULTIPLE_A_ONLY) ; 間違っていたらすみません。ご確認のほどよろしくお願いいたします。
メンテ
Re: PCによって表示が変わる ( No.13 )
名前:管理人 日時:2016/09/25 13:15

すみません、GraphBlend で PMA が付いたブレンドタイプを使用するとエラーが発生するような 状態になってしまっていました 修正版をアップしましたので、よろしければお試しください 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: PCによって表示が変わる ( No.14 )
名前:たろう(解決) 日時:2016/09/25 14:37

たろうです。お世話になっております。 DX_GRAPH_BLEND_PMA_MULTIPLE_A_ONLYでエラーも出ず 正しく表示されることを確認しました m(_ _)mありがとうございました。
メンテ

Page: 1 |

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

   クッキー保存