Re: サンプルと実行結果が同じにならない ( No.1 ) |
- 名前:いっち 日時:2011/04/12 00:23
おそらく透過色を黒以外に設定すると期待通りの結果になるのではないかと思います。
詳しくは以下のスレッドの管理人さんのレス(No.11)をお読み下さい。
> ://hpcgi2.nifty.com/natupaji/bbs/patio.cgi?mode=view&no=2063
|
Re: サンプルと実行結果が同じにならない ( No.2 ) |
- 名前:ryu 日時:2011/04/12 14:24
管理人さんのレス読んで画面クリア色と
転送の透過色を違う色に設定しましたら
AlphaCircle.pngが表示されるようになりました。
しかしウィンドウ自体が紫色に?
よくみたら透明色セットの関数が
SetTransColorがSetBackgroundColor
となっていました。ありがとうございます。
また質問になるのですが、画像の表示を
DrawGraph関数で表示しDrawModiGraph関数で
大きさを変更していたのですが
png画像の透過がうまくいかないので
BltSoftImageWithTransColor関数を使い表示
したのですが、この関数の後DrawModiGraph関数を
使用しても大きさを変えることができません。
BltSoftImageWithTransColorで使用したハンドルを
指定しているのですが・・・
なぜでしょうか?
|
Re: サンプルと実行結果が同じにならない ( No.3 ) |
- 名前:いっち 日時:2011/04/12 20:25
> DrawGraph関数で表示しDrawModiGraph関数で大きさを変更していたのですがpng画像の透過がうまくいかない
再現するソースをご提供いただけますでしょうか?
|
Re: サンプルと実行結果が同じにならない ( No.4 ) |
- 名前:ryu 日時:2011/04/13 12:11
DrawModiGraphを勘違いしていました、これだけでも描画できるんですね、DrawGraphを消しました。
//以下ソースコード
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int screensofthandle, capsofthandle, softhandle, grhandle ;
int opacity, opacityadd ;
// ウインドウモードで起動
ChangeWindowMode( TRUE );
// ウインドウの透過色モードON
SetUseBackBufferTransColorFlag( TRUE ) ;
// DXライブラリの初期化
if( DxLib_Init() < 0 ) return -1;
// 画像の読み込み
grhandle = LoadGraph( "AlphaCircle.png" ) ;
/* SetTransColor を追加 */
// 透過色を設定
SetBackgroundColor( 255, 255,255 ) ;
SetTransColor( 255, 255, 255 ) ;
// 画面出力用のソフトウエア画像の作成
screensofthandle = MakeARGB8ColorSoftImage( 640, 480 ) ;
// 画面キャプチャ用のソフトウエア画像の作成
capsofthandle = MakeXRGB8ColorSoftImage( 640, 480 ) ;
// 描画先を裏画面に
SetDrawScreen( DX_SCREEN_BACK ) ;
// メインループ(何かキーが押されたらループを抜ける)
while( ProcessMessage() == 0 )
{
// 画面をクリア
ClearDrawScreen() ;
// 画像を描画
DrawModiGraph( 0 , 0 , 640 , 0 , 640 , 480 , 0 , 480 , grhandle , TRUE ) ;
// 裏画面への描画結果を取得
GetDrawScreenSoftImage( 0, 0, 640, 480, capsofthandle ) ;
// 画面出力用のソフトウエア画像をクリア
FillSoftImage(screensofthandle, 0, 0, 0, 0 ) ;
// 裏画面の描画結果を透過色つきで画面出力用のソフトウエア画像に転送
BltSoftImageWithTransColor( 0, 0, 640, 480, capsofthandle, 0, 0, screensofthandle, 255, 255, 255, 0 ) ;
// 画面出力用のソフトウエア画像を使ってウインドウの表示を更新
UpdateLayerdWindowForSoftImage( screensofthandle ) ;
}
// DXライブラリの後始末
DxLib_End();
// ソフトの終了
return 0;
}
|
Re: サンプルと実行結果が同じにならない ( No.5 ) |
- 名前:いっち 日時:2011/04/18 23:29
残念ながらryuさんの問題を完全に解決する手段がわかりませんでした。
以下に私のわかる範囲で回答させて頂きます。
> DrawGraph関数で表示しDrawModiGraph関数で大きさを変更していたのですがpng画像の透過がうまくいかない
これはバックバッファに使用している DX_SCREEN_BACK にαチャンネルが存在しないため、
DrawGraphなどで書き込んだ段階でブレンド結果の色情報だけが残り、αチャンネルの半透明情報が失われることが原因です。
対策としてはバックバッファにαチャンネル付のグラフィックハンドルを使用すれば良い・・・と思ったのですが、
あまりうまくいきませんでした。この件は後述します。
> BltSoftImageWithTransColor関数を使い表示したのですが、この関数の後DrawModiGraph関数を使用しても大きさを変えることができません
BltSoftImageWithTransColor はソフトイメージのハンドルを操作し、DrawModiGraph はグラフィックハンドルを操作する関数です。
DrawModiGraph にソフトイメージのハンドルを指定しても正しく動作しません。
■ 問題点 ■
αチャンネル付のグラフィックハンドルをバッファに使用して、
レンダリング結果をレイヤードウィンドウに反映しようとしたのですが、
以下のテストコードを実行すると、この様な ( ://up.mugitya.com/img/Lv.1_up0980.png ) 実行結果が得られました。
※画像がアップローダから流れてしまいそうなので追加しました。
> ://www1.axfc.net/uploader/Img/so/113603.png&key=dxlib
テストコードの意図としては、読み込んだ画像をそのまま描画した場合(画像上段)も
画像を一度レンダリングした結果を描画した場合(画像下段)も同じ画になると思っていました。
しかし、バッファにレンダリングする際にバッファに利用しているグラフィックハンドルのピクセルとブレンドが行われるため
意図通りの結果が得られませんでした。
■ 質問 ■
意図通りの結果を得るためにはどの様にすればよいでしょうか?
DrawGraph等でαチャネル付の画像を描画先のピクセルとブレンドせずに描画する手段があれば実現しそうですが、
その様な方法をご存知の方がいらっしゃいましたらご教授下さい。よろしくお願いします。
//- 以下、テストコード ("AlphaCircle.png"を使用) -//
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int )
{
ChangeWindowMode( TRUE );
SetUseBackBufferTransColorFlag( TRUE );
if ( DxLib_Init( ) == -1 ) return -1;
int gh = LoadGraph( "AlphaCircle.png" );
int sh = LoadSoftImage( "AlphaCircle.png" );
SetDrawValidAlphaChannelGraphCreateFlag( TRUE );
int bgh = MakeScreen( 256, 256 ); // α付のバッファを作成
SetDrawValidAlphaChannelGraphCreateFlag( FALSE );
int bsh = MakeARGB8ColorSoftImage( 640, 480 );
int csh = MakeARGB8ColorSoftImage( 256, 256 );
SetTransColor( 0, 255, 0 );
SetDrawScreen( bgh );
FillGraph( bgh, 0, 0, 0, 0 );
DrawGraph( 0, 0, gh, TRUE ); // α付のバッファにレンダリング
GetDrawScreenSoftImage( 0, 0, 256, 256, csh ); // レンダリング結果をソフトイメージに取得
FillSoftImage( bsh, 0, 0, 0, 0 ) ;
BltSoftImage( 0, 0, 256, 256, sh, 0, 0, bsh ); // ソフトイメージに読み込んだ画像を直接出力
BltSoftImage( 0, 0, 256, 256, csh, 0, 240, bsh ); // バッファを使って加工した画像を出力
UpdateLayerdWindowForSoftImage( bsh );
WaitKey( );
DxLib_End( );
return 0;
}
※テストコードを修正しました
|
Re: サンプルと実行結果が同じにならない ( No.6 ) |
- 名前:ryu 日時:2011/04/15 08:46
いっちさんありがとうございます。
自分のやっていたことは、そもそも操作する
関数の係りが違ったんですね、なるほど。
自分も引き続きやり方あれば教えてください。
|
Re: サンプルと実行結果が同じにならない ( No.7 ) |
- 名前:いっち 日時:2011/05/03 20:13
管理人さんのレスから漏れてしまった気がするので1度だけ上げておきます。
レス(No.5)の問題は解決していません。
対策が無いようであれば無いということを教えて頂けると助かります。
|
Re: サンプルと実行結果が同じにならない ( No.8 ) |
- 名前:管理人 日時:2011/05/04 00:09
すみません、完全に見落としていました
> DrawGraph等でαチャネル付の画像を描画先のピクセルとブレンドせずに描画する手段があれば実現しそうですが、
こちらの機能を実装しました
よろしければこちらのバージョンをダウンロードしてください m(_ _)m
http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用
http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe // BorlandC++ 用
http://homepage2.nifty.com/natupaji/DxLib/DxLibGCCTest.exe // Gnu C++ 用
(中身を既存のライブラリのファイルに上書きして、BCCをお使いの
場合は『再構築』を、VCをお使いの場合は『リビルド』を、
Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい)
SetDrawBlendMode に新たなブレンドモード DX_BLENDMODE_SRCCOLOR を追加しました
こちらのモードにした状態で描画すればαチャンネル付き描画可能画像に対して
描画元アルファ値をそのまま描画先に書き込むことができます
いっちさんが掲載してくださった検証用プログラムに DX_BLENDMODE_SRCCOLOR を
使うようにするとこちらのようになります
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int )
{
ChangeWindowMode( TRUE );
SetUseBackBufferTransColorFlag( TRUE );
if ( DxLib_Init( ) == -1 ) return -1;
int gh = LoadGraph( "AlphaCircle.png" );
int sh = LoadSoftImage( "AlphaCircle.png" );
SetDrawValidAlphaChannelGraphCreateFlag( TRUE );
int bgh = MakeScreen( 256, 256 ); // α付のバッファを作成
SetDrawValidAlphaChannelGraphCreateFlag( FALSE );
int bsh = MakeARGB8ColorSoftImage( 640, 480 );
int csh = MakeARGB8ColorSoftImage( 256, 256 );
SetTransColor( 0, 255, 0 );
SetDrawScreen( bgh );
FillGraph( bgh, 0, 0, 0, 0 );
// BlendParam と画像のα値が乗算されますので、255を指定すれば
// 画像のα値がそのまま描画先に書き込まれます
SetDrawBlendMode( DX_BLENDMODE_SRCCOLOR, 255 ) ;
DrawGraph( 0, 0, gh, TRUE ); // α付のバッファにレンダリング
// ブレンドモードを元に戻す
SetDrawBlendMode( DX_BLENDMODE_NOBLEND, 0 ) ;
GetDrawScreenSoftImage( 0, 0, 256, 256, csh ); // レンダリング結果をソフトイメージに取得
FillSoftImage( bsh, 0, 0, 0, 0 ) ;
BltSoftImage( 0, 0, 256, 256, sh, 0, 0, bsh ); // ソフトイメージに読み込んだ画像を直接出力
BltSoftImage( 0, 0, 256, 256, csh, 0, 240, bsh ); // バッファを使って加工した画像を出力
UpdateLayerdWindowForSoftImage( bsh );
WaitKey( );
DxLib_End( );
return 0;
}
検証用プログラムでは DrawGraph が使用されていますが、DrawGraph の代わりに DrawModiGraph を使用すれば
ryuさんの望まれる処理ができると思います
ただ、αチャンネル付き描画可能画像の機能を使えない環境もあります( 2006年くらいまでに製造されたパソコンの一部 )
のでご注意ください
|
Re: サンプルと実行結果が同じにならない ( No.9 ) |
- 名前:いっち 日時:2011/05/04 11:58
対応ありがとうございます。動作確認できました。
この機能は私も以前にあったらいいなと思っていた機能なのでありがたく使わせて頂きます。
|
Re: サンプルと実行結果が同じにならない ( No.10 ) |
- 名前:ryu 日時:2011/05/06 13:34
自分からも管理人さんありがとうございました。
さっそく試してみたいと思います(^^
|
Re: サンプルと実行結果が同じにならない(解決) ( No.11 ) |
- 名前:ryu 日時:2011/05/07 07:38
タイトルに解決を入れ忘れていました、すいません
再投稿
|
Re: サンプルと実行結果が同じにならない ( No.12 ) |
- 名前:ryu(解決) 日時:2011/05/07 07:40
タイトルじゃなくて名前でした、申し訳ない
|
|