> 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 の方ではデフォルトの値を取得する手段はありません