私は DirectCompute テクノロジに本当に慣れていないので、控えめに言っても、msdn Web サイトのドキュメントから学ぼうとしています。
4x4 行列と 4xN 行列を取り、乗算結果を返す基本的な hlsl ファイルを作成したいと思います。しかし、コードでしばらく遊んだ後、理解できない奇妙なものを見つけました。主に、渡すスレッドがバッファを処理してデータを出力する方法です。
これらすべての例で、2 つの 16 浮動小数点バッファーを渡し、16 浮動小数点バッファーを取得してから、4x1x1 のグループ化でディスパッチします。私の C++ コードで見たいセクションがあれば教えてください。
次のコードを使用します。
StructuredBuffer<float4x4> base_matrix : register(t0); // byteWidth = 64
StructuredBuffer<float4> extended_matrix : register(t1); // byteWidth = 64
RWStructuredBuffer<float4> BufferOut : register(u0); // byteWidth = 64, zeroed out before reading from the GPU
[numthreads(1, 1, 1)]
void CSMain( uint3 DTid : SV_DispatchThreadID )
{
BufferOut[DTid.x].x = 1;
}
次の値を取得します。
1.000 0.000 0.000 0.000
1.000 0.000 0.000 0.000
1.000 0.000 0.000 0.000
1.000 0.000 0.000 0.000
これは私には理にかなっています-バッファは4つのスレッドとして解析され、それぞれが1つのfloat4グループ化を実行します.
次のコードを使用します。
StructuredBuffer<float4x4> base_matrix : register(t0); // byteWidth = 64
StructuredBuffer<float4> extended_matrix : register(t1); // byteWidth = 64
RWStructuredBuffer<float4> BufferOut : register(u0); // byteWidth = 64, zeroed out before reading from the GPU
[numthreads(1, 1, 1)]
void CSMain( uint3 DTid : SV_DispatchThreadID )
{
BufferOut[DTid.x].x = 1;
BufferOut[DTid.x].y = 2;
BufferOut[DTid.x].z = 3;
BufferOut[DTid.x].w = 4;
}
次の値を取得します。
1.000 1.000 1.000 1.000
1.000 1.000 1.000 1.000
1.000 1.000 1.000 1.000
1.000 1.000 1.000 1.000
そして、私が実行したい実際のコードで:
StructuredBuffer<float4x4> base_matrix : register(t0);
StructuredBuffer<float4> extended_matrix : register(t1);
RWStructuredBuffer<float4> BufferOut : register(u0);
[numthreads(1, 1, 1)]
void CSMain( uint3 DTid : SV_DispatchThreadID )
{
BufferOut[DTid.x] = mul(base_matrix[0],extended_matrix[DTid.x])
}
次の値を取得します。
0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000
ここで重要なことを見逃していることはわかりますが、私の人生では、これらがどのように機能するかを説明する適切なドキュメントを見つけることができません。誰かがこのコードで何が起こっているのかを理解するのを手伝ってくれますか?
御時間ありがとうございます、
ザック
別の注記として、このコードは Microsoft DirectX SDK (2010 年 6 月)\Samples\C++\Direct3D11\BasicCompute11 サンプルを使用して一緒に作成されました。私がひどく間違ったことをしている場合は、遠慮なくお知らせください。私はHLSLで本当に新しいです。
編集:私のバッファ作成コード。
CreateStructuredBuffer( g_pDevice, sizeof(float)*16, 1, g_matrix, &g_pBuf0 );
CreateStructuredBuffer( g_pDevice, sizeof(float)*4, NUM_ELEMENTS, g_extended_matrix, &g_pBuf1 );
CreateStructuredBuffer( g_pDevice, sizeof(float)*4, NUM_ELEMENTS, NULL, &g_pBufResult );
//--------------------------------------------------------------------------------------
// Create Structured Buffer
//--------------------------------------------------------------------------------------
HRESULT CreateStructuredBuffer( ID3D11Device* pDevice, UINT uElementSize, UINT uCount, VOID* pInitData, ID3D11Buffer** ppBufOut )
{
*ppBufOut = NULL;
D3D11_BUFFER_DESC desc;
ZeroMemory( &desc, sizeof(desc) );
desc.BindFlags = D3D11_BIND_UNORDERED_ACCESS | D3D11_BIND_SHADER_RESOURCE;
desc.ByteWidth = uElementSize * uCount;
desc.MiscFlags = D3D11_RESOURCE_MISC_BUFFER_STRUCTURED;
desc.StructureByteStride = uElementSize;
if ( pInitData )
{
D3D11_SUBRESOURCE_DATA InitData;
InitData.pSysMem = pInitData;
return pDevice->CreateBuffer( &desc, &InitData, ppBufOut );
} else
return pDevice->CreateBuffer( &desc, NULL, ppBufOut );
}
.1,.2,.3,.4 を試しています ...
StructuredBuffer<float4x4> base_matrix : register(t0);
StructuredBuffer<float4> extended_matrix : register(t1);
StructuredBuffer<uint> loop_multiplier : register(t2);
RWStructuredBuffer<float4> BufferOut : register(u0);
[numthreads(1, 1, 1)]
void CSMain( uint3 DTid : SV_DispatchThreadID )
{
BufferOut[DTid.x].x = .1;
BufferOut[DTid.x].y = .2;
BufferOut[DTid.x].z = .3;
BufferOut[DTid.x].w = .4;
}
これを得た:
0.100 0.100 0.100 0.100
0.100 0.100 0.100 0.100
0.100 0.100 0.100 0.100
0.100 0.100 0.100 0.100