お待たせしました、シェーダーを使用するビルボード描画の関数を追加しましたので、
よろしければこちらをダウンロードしてください 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 ) ;