トップページ > 過去ログ > 記事閲覧
C++からのシェーダ定数入力について
名前:愛煙家 日時: 2010/12/12 20:11

いつもお世話になっております 「自作シェーダの使用について」というスレッドに 記載されていたサンプルプログラムを 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 ; }

Page: 1 |

Re: C++からのシェーダ定数入力について ( No.1 )
名前:管理人 日時:2010/12/26 18:51

ご返信が遅くなり申し訳ありません ご報告いただいた現象はDXライブラリ側で描画の直前に定数レジスタ0番の値を 変更してしまっていたのが原因でした 修正したバージョンをアップしましたので、よろしければお試しになってみてください m(_ _;m http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe // BorlandC++ 用 (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』、VCをお使いの場合は『リビルド』をして下さい)
Re: C++からのシェーダ定数入力について ( No.2 )
名前:愛煙家 日時:2010/12/26 20:22

ご対応ありがとうございますm(_ _)m 修正バージョンで正しくシェーダ側に値が渡っている事が確認できました!!

Page: 1 |