トップページ > 記事閲覧
ビルボードについて
名前:gura 日時: 2016/02/13 01:31

DrawBillboard3Dで描画した場合のピクセルシェーダの、 使い方がわかりません。 どうやったら良いのでしょうか?
メンテ

Page: 1 |

Re: ビルボードについて ( No.1 )
名前:管理人 日時:2016/02/15 03:27

DrawBillboard3D や DrawGraph などの普通の画像を描画する関数で自前のピクセルシェーダを 使用することはできません、自前のピクセルシェーダが使用できるのは DrawPolygon3DToShader や DrawPrimitive2DToShader などのポリゴンを描画する関数のみです ビルボードの描画でピクセルシェーダーをどのようなことに使用されたいのでしょうか?
メンテ
Re: ビルボードについて ( No.2 )
名前:gura 日時:2016/02/15 11:28

ピクセルシェーダを用いて画像を半分にしたいのです。 半分にするとは、キャラを倒したときの演出として、 敵を真っ二つかつ毎回ランダムな角度で切断というものです。 ピクセルシェーダで指定された傾きの線の右側だけ色を抽出するのと左側だけ色を抽出するものわ2つ用意して、 それぞれをキャラが死んだときに別々に描画して切断される演出が出来ると考えています。
メンテ
Re: ビルボードについて ( No.3 )
名前:管理人 日時:2016/02/21 05:00

すみません、ご返信を見落としていました m(_ _;m ビルボードの描画でピクセルシェーダーを使用できる仕組みを考えてみますので、少々お待ちください
メンテ
Re: ビルボードについて ( No.4 )
名前:管理人 日時:2016/02/22 01:37

お待たせしました、シェーダーを使用するビルボード描画の関数を追加しましたので、 よろしければこちらをダウンロードしてください 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 DrawBillboard3DToShader( VECTOR Pos, float cx, float cy, float Size, float Angle, int GrHandle, int TransFlag, int TurnFlag = FALSE ) ; SetUsePixelShader でセットしたピクセルシェーダーを使用するという以外は DrawBillboard3D と同じです 上記の関数を使用してオリジナルのシェーダーを使ったビルボードの描画は以下のようになります #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int grhandle, pshandle ; ChangeWindowMode(TRUE); // 使用する Direct3D のバージョンを 9Ex に変更 SetUseDirect3DVersion( DX_DIRECT3D_9EX ) ; if( DxLib_Init() == -1 ) { return -1 ; } // 画像の読み込み grhandle = LoadGraph( "Test1.bmp" ) ; // ピクセルシェーダーバイナリコードの読み込み pshandle = LoadPixelShader( "SamplePS.pso" ) ; SetDrawScreen( DX_SCREEN_BACK ) ; while( ProcessMessage() == 0 ) { ClearDrawScreen() ; // 使用するピクセルシェーダーをセット SetUsePixelShader( pshandle ) ; // シェーダーを使ったビルボードの描画 DrawBillboard3DToShader( VGet( 320.0f, 240.0f, 0.0f ), 0.5f, 0.5f, 118.0f, 0.0f, grhandle, TRUE ) ; ScreenFlip() ; } DxLib_End() ; return 0 ; } ピクセルシェーダーのコードはこのようになっています struct PS_INPUT { float4 Diffuse : COLOR0 ; float4 Specular : COLOR1 ; float2 TexCoords0 : TEXCOORD0 ; float2 TexCoords1 : TEXCOORD1 ; } ; struct PS_OUTPUT { float4 Output : COLOR0 ; } ; sampler sampler0 : register( s0 ) ; PS_OUTPUT main( PS_INPUT psin ) { PS_OUTPUT psout ; float4 texc ; texc = tex2D( sampler0, psin.TexCoords0 ) ; psout.Output.r = texc.b ; psout.Output.g = texc.g ; psout.Output.b = texc.r ; psout.Output.a = texc.a ; return psout ; } DrawPolygon3DToShader などでは使用するテクスチャを予め SetUseTextureToShader でセットして、 描画関数自体にはグラフィックハンドルを引数に渡しませんが、DrawBillboard3DToShader では 画像のサイズなどが必要になるため引数としてグラフィックハンドルを渡しているので、 SetUseTextureToShader は DrawBillboard3DToShader の中で行われています( sampler0 にセットされます ) こちらに実行ファイルやピクセルシェーダーコードをコンパイルしたバイナリファイルなどを纏めたものを アップしましたので、よろしければご覧ください https://dxlib.xsrv.jp/temp/BillboardPS.zip 因みに切断された位置の決定にテクスチャ座標を使用されると思いますが、仮に2のn乗ではないサイズの画像を使用する場合 DXライブラリ内部では2のn乗のサイズのテクスチャが割り当てられることもありますので、グラフィックハンドルに 割り当てられたテクスチャのサイズを予め GetGraphTextureSize で取得して位置合わせをするようにしてください // グラフィックハンドルが持つ一つ目のテクスチャのサイズを得る int GetGraphTextureSize( int GrHandle, int *SizeXBuf, int *SizeYBuf ) ;
メンテ
Re: ビルボードについて ( No.5 )
名前:gura 解決済み 日時:2016/02/27 17:25

ビルボードでのシェーダー適応ありがとうございます。 サンプルをもとに実装してみます。 対応ありがとうございました。
メンテ

Page: 1 |

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

   クッキー保存