我真的很新的DirectCompute技術,並一直試圖從MSDN網站,這是..密集的文檔來學習,至少可以這樣說。HLSL緩衝區跨度和線程 - 這裏發生了什麼?
我想提出一個基本的HLSL文件發生在一個4x4矩陣和4xN矩陣,並返回相乘的結果。但是花了一些時間玩代碼後,我發現了一些我不明白的奇怪東西 - 主要是我傳遞的線程如何處理緩衝區和輸出數據。
通過所有這些示例,我傳遞了兩個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
我可以告訴我在這裏缺少一個關鍵的事情,但對我的生活我不能找到相應的文檔告訴我如何工作的。有人能幫我理解這段代碼中發生了什麼嗎?
感謝您的時間,
扎克
至於另注,此代碼是使用微軟的DirectX SDK(2010年6月)\樣本\ 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
你能張貼在那裏你創建你ID3D11Buffers和相應的ID3D11ShaderResourceView和ID3D11UnorderedAccessView對象,包括用於創建它們的各種* _DESC對象的內容的代碼?另外,隨機預感:在第二個例子中,你可以嘗試寫出0.1,0.2,0.3,0.4而不是1,2,3,4嗎? – postgoodism
我會在早上發表(eta 8小時)。直到後來才發現這一點。但預先感謝! –
@postgoodism:添加了我的緩衝區創建代碼。需要幫助請叫我。 –