いつもお世話になっております
「自作シェーダの使用について」というスレッドに
記載されていたサンプルプログラムを
C++側からシェーダ定数を設定するように変更してみたのですが
シェーダ側に定数が渡ってきてないように見えます。
シェーダ側ではテクスチャカラーを、渡ってきた定数で乗算するようにして、
C++側では 1.0f を設定することで、元の画像が表示されることを期待していたのですが、
実行すると、元の画像が青暗く表示されました。
因みに 1.0f 以外の数値を渡しても全く変化はありません。
GetConstIndexToShader()、SetPSConstF() 共にエラーは返しておらず、
DirectX関数呼び出しも行われていました。
お忙しいところ大変恐縮ではございますが、
C++プログラムとシェーダプログラムを添付しますので、
ご確認お願いできますでしょうか?
宜しくお願い致します。
---------- C++プログラム ----------
#include "DxLib.h"
// プログラムは WinMain から始まります
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
int grhandle, pshandle ;
VERTEX2DSHADER Vert[ 6 ] ;
// ウインドウモードで起動
ChangeWindowMode( TRUE );
// DXライブラリの初期化
if( DxLib_Init() < 0 ) return -1;
// 画像の読み込み
grhandle = LoadGraph( "Test1.bmp" );
// ピクセルシェーダーバイナリコードの読み込み
pshandle = LoadPixelShader( "shader\\bright.pso" ) ;
// 頂点データの準備
Vert[ 0 ].pos = VGet( 0.0f, 0.0f, 0.0f ) ;
Vert[ 1 ].pos = VGet( 128.0f, 0.0f, 0.0f ) ;
Vert[ 2 ].pos = VGet( 0.0f, 512.0f, 0.0f ) ;
Vert[ 3 ].pos = VGet( 128.0f, 512.0f, 0.0f ) ;
Vert[ 0 ].dif = GetColorU8( 255,255,255,255 ) ;
Vert[ 0 ].spc = GetColorU8( 0,0,0,0 ) ;
Vert[ 0 ].u = 0.0f ; Vert[ 0 ].v = 0.0f ;
Vert[ 1 ].u = 1.0f ; Vert[ 1 ].v = 0.0f ;
Vert[ 2 ].u = 0.0f ; Vert[ 2 ].v = 1.0f ;
Vert[ 3 ].u = 1.0f ; Vert[ 3 ].v = 1.0f ;
Vert[ 0 ].su = 0.0f ; Vert[ 0 ].sv = 0.0f ;
Vert[ 1 ].su = 1.0f ; Vert[ 1 ].sv = 0.0f ;
Vert[ 2 ].su = 0.0f ; Vert[ 2 ].sv = 1.0f ;
Vert[ 3 ].su = 1.0f ; Vert[ 3 ].sv = 1.0f ;
Vert[ 0 ].rhw = 1.0f ;
Vert[ 1 ].rhw = 1.0f ;
Vert[ 2 ].rhw = 1.0f ;
Vert[ 3 ].rhw = 1.0f ;
Vert[ 4 ] = Vert[ 2 ] ;
Vert[ 5 ] = Vert[ 1 ] ;
// 使用するテクスチャをセット
SetUseTextureToShader( 0, grhandle ) ;
// 使用するピクセルシェーダーをセット
SetUsePixelShader( pshandle ) ;
int cindex = GetConstIndexToShader("gBright", pshandle);
FLOAT4 f4 = {1.0f, 1.0f, 1.0f, 1.0f};
SetPSConstF(cindex, f4);
// 描画
DrawPrimitive2DToShader( Vert, 6, DX_PRIMTYPE_TRIANGLELIST ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End();
// ソフトの終了
return 0;
}
---------- bright.fx ----------
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 ) ;
float4 gBright;
PS_OUTPUT main( PS_INPUT psin )
{
PS_OUTPUT psout ;
float4 texc ;
// テクスチャカラーの読み出し
texc = tex2D( sampler0, psin.TexCoords0 ) ;
// テクスチャカラーにC++から渡ってきた定数を乗算して出力
psout.Output.r = texc.r * gBright.x;
psout.Output.g = texc.g * gBright.y;
psout.Output.b = texc.b * gBright.z;
psout.Output.a = texc.a;
return psout ;
}