トップページ > 過去ログ > 記事閲覧
DrawPolygon3Dのテクスチャを透過させる
名前:コーラ 日時: 2009/09/15 16:51

DrawPolygon3Dのテクスチャを透過させるにはどうすればいいのでしょうか? DrawPolygon3Dで、画像を貼り付けたテクスチャを描画しています。 しかし、テクスチャを透過させる方法が分かりません。 DrawPolygon3Dに透過フラグがありますが、TRUEにしても何も変化はありません。 2Dの描画関数ではSetTransColorで画像を読み込む時に透過色を指定して、後はほぼ何も問題なく使っていました。 おそらく根本的なところで何かを勘違いしてると思うのですが、よろしくお願いします

Page: 1 |

Re: DrawPolygon3Dのテクスチャを透過させる ( No.1 )
名前:管理人 日時:2009/09/15 23:19

私の手元でも確認してみましたが、問題なく透過されました もしかしたら最新のバージョンでは直っているかもしれませんので よろしければこちらのバージョンをお試しになってみてください m(_ _)m http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』、VCをお使いの場合は『リビルド』をして下さい)
Re: DrawPolygon3Dのテクスチャを透過させる ( No.2 )
名前:コーラ 日時:2009/09/16 01:08

わざわざすみません、ありがとうございます。 しかし、おそらくライブラリが原因ではありません。 やっぱり透過されませんでした。 ヒントを求めて検索してみたところ //dixq.net/rp/57.html(竜神録プログラミングの館-57章-) こちらのサンプルプログラムに行き着きました。 ここに登場するサンプルプログラムに //ポリゴンを透過色無しで2枚描画 DrawPolygon3D( Vertex, 2, GrHandle, TRUE ) ; といった記述が登場するのですが これは透過フラグがTRUEなので、何らかの方法で透過される、と思っているのですが、違うのでしょうか? ポリゴンを透過させる場合、ここはどのような記述になるのでしょうか?
Re: DrawPolygon3Dのテクスチャを透過させる ( No.3 )
名前:kenta 日時:2009/09/16 01:37

管理人ではないですが・・・ アルファチャンネルを持ったテクスチャを貼ればたぶん透過されると思いますよ?(透過pngとか) 一昔前のグラフィックボードによっては2のべき乗以外のサイズのテクスチャを貼ると透過されなかったりとか縦横のサイズが同じじゃないと表示がおかしいとかあったみたいですが…(ドライバのアップデートでなおる)
Re: DrawPolygon3Dのテクスチャを透過させる ( No.4 )
名前:コーラ 日時:2009/09/16 14:31

色々と違う画像を張ってみた所、透過に成功しました。 実は、透過が失敗している画像は、MakeGraphで作った描画可能な画像です。 普通に2Dの描画でも透過ができていませんでした。 どうやら私は、このように作った画像を透過させる方法を理解していないようです。 #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { // ウィンドウモード ChangeWindowMode(TRUE); if( DxLib_Init() == -1 ){ return -1;// エラーが起きたら直ちに終了 } // 描画可能画像のハンドル int SCR1 ; // 描画可能画像の作成を指定 SetDrawValidGraphCreateFlag( TRUE ) ; // R255 G0 B255を透明色にする SetTransColor(255,0,255); // 256x256 の描画可能画像を作成 SCR1 = MakeGraph( 256, 256 ) ; SetDrawValidGraphCreateFlag( FALSE ) ; // 描画先を描画可能画像にする SetDrawScreen( SCR1 ) ; // まず全体に透明色で塗り潰す DrawBox(0,0,256,256,GetColor(255,0,255),TRUE); // 左上に白いボックス描画する DrawBox(0,0,64,64,GetColor(255,255,255),TRUE); // 描画先を裏画面にする SetDrawScreen(DX_SCREEN_BACK); // 上で作った画像を、透過色有効で張る DrawGraph(0,0,SCR1,TRUE); // 表画面に反映 ScreenFlip(); // キーの入力待ち((6-3)『WaitKey』を使用) WaitKey() ; DxLib_End() ;// DXライブラリ使用の終了処理 return 0 ;// ソフトの終了 } このプログラムは、最終的に黒い画面の左上に、白いボックスだけを表示させたいのですが、 透過色のR255G0B255も表示されてしまいます。 何が悪いのでしょうか? すみませんが、よろしくお願いしますm(_ _)m
Re: DrawPolygon3Dのテクスチャを透過させる ( No.5 )
名前:sy(サイ) 日時:2009/09/16 15:56

上記のプログラムを実行したところ、真っ黒の画面上左上隅に白い矩形が描画されました。 プログラムの問題ではなさそうに思います。 やはりドライバー側の問題なのでしょうかね・・・
Re: DrawPolygon3Dのテクスチャを透過させる ( No.6 )
名前:コーラ 日時:2009/09/16 17:53

報告ありがとうございます もしかしたらプログラムの問題じゃないかもしれないということで色々試してみました。 まず3.00aで>>4を実行すると、透過色も表示されてしまいます。 ただ、SetUse3DFlag( FALSE ) ;すると、白い矩形だけが表示される期待通りの動作になりました。 次に>>1の管理人様のバージョンを試しましたが、結果は3.00aと全く同じになっています。 最後に、2.25bを試してみると、>>4のプログラムそのままで、期待通りの動作になりました。 SetUse3DFlag( FALSE ) ;しなくても、白い矩形のみが表示されています。
Re: DrawPolygon3Dのテクスチャを透過させる ( No.7 )
名前:管理人 日時:2009/09/17 09:51

すいません、描画可能な画像の透過色の機能は DirectX9版( Ver3.00 以降 )では機能しません これは Direct3D8 以降、DirectX 自体から「透過色」という概念が無くなってしまったからで ( 代わりにアルファチャンネルとアルファブレンドを使ってねということらしいです ) DirectX7 の頃のように描画された色から透過するかどうかを判断することができなくなってしまった結果です なので DirectX9 版では通常画像の透過色の機能は DirectX の「透過色」の機能ではなく、 画像をテクスチャに転送する際に透過色とされている色のピクセルの透明度を最大にして 透過色の機能を実現しています DirectX 自体の仕様の変更に因るものなので私の方ではどうにもできません ( ピクセルシェーダーを使用すれば可能ですが、その処理のために必要動作性能を引き上げて よいのもかどうかは別途判断が必要になります ) 申し訳ありません・・・
Re: DrawPolygon3Dのテクスチャを透過させる ( No.8 )
名前:コーラ 日時:2009/09/17 20:24

管理人様、ありがとうございます。 描画可能な画像の透過色は使えなくなったのですか・・・。 描画可能な画像を作成し、描画先をその画像にすることによって、DXライブラリの描画関数を使って、 複雑な画像も簡単に分かりやすく作成できるのでとても重宝していました。 描画可能な画像に透過色が使えないとなると、その画像の背景色を透過させることができなくなりますよね? 少し考えましたが、今の私にはその解決策が思いつけません。 何かいい方法はありますか? あるいは、描画可能な画像に書き込むことによって、DXライブラリの描画関数で画像を作れることに対する 代替案みたいものはありますでしょうか。
Re: DrawPolygon3Dのテクスチャを透過させる ( No.9 )
名前:管理人 日時:2009/09/20 08:46

うーん、LoadSoftImage 関係のソフトウエアで扱うイメージを描画可能画像の代わりに使用して 複雑な画像のグラフィックハンドルを作成するのが一番適切のような気がしますが、 ソフトイメージ間の透過色付き転送の機能が無いんですよね・・・ 描画可能画像に対しては何の関数を使用して描画しているのでしょうか?
Re: DrawPolygon3Dのテクスチャを透過させる ( No.10 )
名前:コーラ 日時:2009/09/20 20:56

普通にDrawGraphで描画可能な画像に組み立ててから 実際のゲーム画面に使ったり、 文字などを画像にしてから伸縮や回転をしようと思っていました。 一番上のテクスチャの件では 画像を貼ったテクスチャを、ギアのように回転させたかったのですが、三次元行列を扱うのが始めてだったので とりあえずまず、描画可能画像に回転させたい画像をDrawRotaGraphで二次元的に回転させて それをテクスチャに貼ってみようと考えていました。 文字以外は別の方法でもすぐできそうです。 というよりこっちの方法がおかしいんでしょうが 楽にこんな方法もできて便利だなぁと思っていたもので・・・。
Re: DrawPolygon3Dのテクスチャを透過させる ( No.11 )
名前:管理人 日時:2009/09/21 09:08

確かにテクスチャの画像を動的に書き換える方法でギアの回転させる方法はちょっと 難しいですが、文字を画像にしてから伸縮や回転を、という方法は現時点の最新のバージョンでも可能です リファレンスマニュアルには載っていませんが、ソフトウエアイメージと以下の関数を使用します ( BltStringSoftImageToHandle は BltStringSoftImage のフォントハンドルを指定するタイプです ) // ソフトウエアで扱うイメージに文字列イメージを転送する int BltStringSoftImage( int x, int y, const char *StrData, int DestSIHandle, int DestEdgeSIHandle ) ; // ソフトウエアで扱うイメージに文字列イメージを転送する( フォントハンドル使用版 ) int BltStringSoftImageToHandle( int x, int y, const char *StrData, int DestSIHandle, int DestEdgeSIHandle, int FontHandle ) ; 引数は以下の通りです x, y : ソフトウエアイメージ上の文字を描画したい座標を StrData : 描画する文字列 DestSIHandle : 文字の本体部分を描画するソフトウエアイメージ DestEdgeSIHandle : 文字の縁部分を描画するソフトウエアイメージ( 縁なしの場合は -1 ) FontHandle : フォントハンドル こちらの関数を使用して縁付き文字列を画像にして2倍拡大描画する場合は以下のようになります #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int FontHandle, ImageHandle, EdgeImageHandle, DrawWidth ; int SoftImage, EdgeSoftImage ; // ウインドウモードで起動 ChangeWindowMode( TRUE ) ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1 ; // 縁つきアンチエイリアスフォントの作成 FontHandle = CreateFontToHandle( NULL, 24, -1, DX_FONTTYPE_ANTIALIASING_EDGE ) ; // 文字列イメージを転送する ARGB8形式の画面サイズのメモリイメージを作成( 縁用と二つ ) SoftImage = MakeARGB8ColorSoftImage( 640, 480 ) ; EdgeSoftImage = MakeARGB8ColorSoftImage( 640, 480 ) ; // 作成したメモリイメージを0で塗りつぶす FillSoftImage( SoftImage, 0, 0, 0, 0 ) ; FillSoftImage( EdgeSoftImage, 0, 0, 0, 0 ) ; // 文字列イメージをメモリイメージに書き込む BltStringSoftImageToHandle( 0, 0, "テスト文字列", SoftImage, EdgeSoftImage, FontHandle, FALSE ) ; // 描画幅を取得する DrawWidth = GetDrawStringWidthToHandle( "グラデーションテスト", lstrlen( "グラデーションテスト" ), FontHandle ) ; // 描画幅と描画高さのグラフィックハンドルを作成する ImageHandle = CreateGraphFromRectSoftImage( SoftImage, 0, 0, DrawWidth, 26 ) ; EdgeImageHandle = CreateGraphFromRectSoftImage( EdgeSoftImage, 0, 0, DrawWidth, 26 ) ; // 縁の部分は黄色で、中身の部分は赤で2倍拡大描画 SetDrawBright( 255, 255, 0 ) ; DrawExtendGraph( 0, 0, DrawWidth * 2, 26 * 2, EdgeImageHandle, TRUE ) ; SetDrawBright( 255, 0, 0 ) ; DrawExtendGraph( 0, 0, DrawWidth * 2, 26 * 2, ImageHandle, TRUE ) ; SetDrawBright( 255, 255, 255 ) ; // キー入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; } これで文字を画像にして・・・というのは実現可能です ただ、ソフトウエアイメージには透過色付き転送が今は無いので 「普通にDrawGraphで描画可能な画像に組み立ててから実際のゲーム画面に使ったり」 の中で言われている DrawGraph が透過色を透過させる指定の描画を使用されていたら 現状ではできません 事前に画像を組み立てておいて使用する方法は、透過色で抜く部分が少なければ 何度も DrawGraph を実行しなければならないところを一回の DrawGraph で済ませる ことができるのでその分CPUの負荷が減り有効ですが、組み立てる画像の大部分が 透過色で抜かれるような画像の場合は、画像の組み立てに使用する画像を個別で 毎フレーム DrawGraph で描画したほうがCPUへの負荷が多少増えることを考えても GPUへの負荷が少なくて済むことのほうが大きかったりします
Re: DrawPolygon3Dのテクスチャを透過させる ( No.12 )
名前:コーラ 日時:2009/09/24 22:57

管理人様、ありがとうございます。 プログラム使ってみました。 この方法だと、透明度を含んで塗りつぶし、さらにそこに文字列を送り込むことができるのですね。 そしてそれを画像にすれば・・・。 他の方はやり方の問題ですし、改善(?)しようと思います。

Page: 1 |