トップページ > 記事閲覧
CreateShaderConstantBuffer や SetShaderConstantBuffer で扱える容量
名前:いし 日時: 2024/04/11 15:49

CreateShaderConstantBuffer や SetShaderConstantBuffer で扱える容量について sizeof(float) * 4 以上のサイズは扱えないのでしょうか? 例えば int handle = CreateShaderConstantBuffer(sizeof(float) * 4 * 4); // 4 * FLOAT4 で確保した後 FLOAT4 *f4a = (FLOAT4 *)GetBufferShaderConstantBuffer(handle); f4a[0].x = 1.0f; // 他略 f4a[1].x = 1.0f; // 他略 f4a[2].x = 1.0f; // 他略 f4a[3].x = 1.0f; // 他略 UpdateShaderConstantBuffer(handle); SetShaderConstantBuffer(handle, DX_SHADERTYPE_PIXEL, 5); // register(b5) に set 等とした場合 cbuffer cb_5 : register(b5) { float4 a; float4 b; float4 c; float4 d; } shader 側で f4a[0] の部分は set した値が a に得られているのですが、 f4a[1] から f4a[3] の部分は b から d に入っていないようなのです。 また上とは別件になりますが GetBufferShaderConstantBuffer(handle) では デフォルトのデータは取得出来ないのでしょうか? (最初は 0.0f で初期化されている。二回目以降は前回セットした内容。) DirectX9 のときは GetConstDefaultParamFToShader で取得出来ていた内容に相当するものを 取得する関数はありますか? よろしくお願いします
メンテ

Page: 1 |

Re: CreateShaderConstantBuffer や SetShaderConstantBuffer で扱える容量 ( No.1 )
名前:いし(訂正) 日時:2024/04/12 15:29

お世話になっております。 前半の容量については解決しました(書き込めました)。 (原因は shader 側の struct の記述の問題だと思います。) cbuffer cb_5 : register(b5) { float4 a; float4 b; float c0; float c1; float c2; float c3; float4 d; } の様な定義で受け取ろうとすると(勝手な期待ですが)期待と違う結果になることがあるようです。 後者の DirectX9 のときは GetConstDefaultParamFToShader で取得出来ていた内容に相当するものを DX11 で同様に取得する関数はありますか? もしよろしければご回答頂けますと幸いです。
メンテ
Re: CreateShaderConstantBuffer や SetShaderConstantBuffer で扱える容量 ( No.2 )
名前:管理人 日時:2024/04/13 00:32

> CreateShaderConstantBuffer や SetShaderConstantBuffer で扱える容量について > sizeof(float) * 4 以上のサイズは扱えないのでしょうか? いえ、sizeof(float) * 4 以上のサイズも扱えます > shader 側で f4a[0] の部分は set した値が a に得られているのですが、 > f4a[1] から f4a[3] の部分は b から d に入っていないようなのです。 手元で以下のようなプログラムを組んでみましたが、問題なく f4a[1] から f4a[3] の部分も b から d に入っていました( r=0.5 g=1.0 b=0.5 の明るい緑色の四角形が描画されます、 rはf4a[1].x gはf4a[2].x bはf4a[3].x の値が反映されています ) // C++のコード #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int consthandle, pshandle ; VERTEX2DSHADER Vert[ 6 ] ; // ウインドウモードで起動 ChangeWindowMode( TRUE ); // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1; // ピクセルシェーダーバイナリコードの読み込み pshandle = LoadPixelShader( "TestPS.pso" ) ; // 使用するピクセルシェーダーをセット SetUsePixelShader( pshandle ) ; // 定数バッファの作成 consthandle = CreateShaderConstantBuffer( sizeof(float) * 4 * 4 ) ; // 定数バッファの内容をセット FLOAT4 *f4a = (FLOAT4 *)GetBufferShaderConstantBuffer(consthandle); f4a[0].x = 1.0f; // 他略 f4a[1].x = 0.5f; // 他略 f4a[2].x = 1.0f; // 他略 f4a[3].x = 0.5f; // 他略 UpdateShaderConstantBuffer( consthandle ); // 使用する定数バッファーをセット SetShaderConstantBuffer( consthandle, DX_SHADERTYPE_PIXEL, 5 ) ; // 頂点データの準備 Vert[ 0 ].pos = VGet( 0.0f, 0.0f, 0.0f ) ; Vert[ 1 ].pos = VGet( 256.0f, 0.0f, 0.0f ) ; Vert[ 2 ].pos = VGet( 0.0f, 256.0f, 0.0f ) ; Vert[ 3 ].pos = VGet( 256.0f, 256.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 = 1.0f ; Vert[ 3 ].v = 1.0f ; Vert[ 3 ].u = 0.0f ; Vert[ 2 ].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 = 1.0f ; Vert[ 3 ].sv = 1.0f ; Vert[ 3 ].su = 0.0f ; Vert[ 2 ].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 ] ; // 画面をクリア ClearDrawScreen() ; // 描画 DrawPrimitive2DToShader( Vert, 6, DX_PRIMTYPE_TRIANGLELIST ) ; // キー入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End(); // ソフトの終了 return 0; } // HLSLのコード cbuffer cb_5 : register(b5) { float4 a; float4 b; float4 c; float4 d; } struct VS_SHADER2D_OUTPUT { float4 Position : SV_POSITION ; float4 Diffuse : COLOR0 ; float4 Specular : COLOR1 ; float2 TexCoords0 : TEXCOORD0 ; float2 TexCoords1 : TEXCOORD1 ; } ; float4 main( VS_SHADER2D_OUTPUT In ) : SV_TARGET0 { float4 DestColor ; DestColor.r = b.r; DestColor.g = c.r; DestColor.b = d.r; DestColor.a = 1.0; return DestColor ; } いしさんがお試しされたコードとの違いがあるか等確認してみてください > また上とは別件になりますが GetBufferShaderConstantBuffer(handle) では > デフォルトのデータは取得出来ないのでしょうか? はい、Direct3D 11 の方ではデフォルトの値を取得する手段はありません
メンテ

Page: 1 |

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

   クッキー保存