Hi guys.
So I'm having a small problem here, I've got a structured buffer, in which I want to fill some data, the structure looks like this: ( The whole point is converting the individual textures ( deferred rendering ), into a readable buffer )
struct GBElement
{
// World Space Positions
D3DXVECTOR4 positionWS;
// World Space normals
D3DXVECTOR4 normalWS;
// Roughness
float roughness;
// Special Post Processing Flag
float post_flag;
};
AFAIK, the elements do not have to be 16 aligned.
Now this is how I create my structured buffer: ( For the stride I've simply used sizeof(GBElement), where count is the number of elements )
D3D11_BUFFER_DESC bufferDesc;
int stride = size;
bufferDesc.ByteWidth = stride*count;
bufferDesc.Usage = D3D11_USAGE_DEFAULT;
bufferDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_UNORDERED_ACCESS;
bufferDesc.CPUAccessFlags = 0;
bufferDesc.MiscFlags = D3D11_RESOURCE_MISC_BUFFER_STRUCTURED;
bufferDesc.StructureByteStride = stride;
if(pDev->CreateBuffer(&bufferDesc,NULL,&pp->pData)!=S_OK)
return NULL;
D3D11_UNORDERED_ACCESS_VIEW_DESC uavDesc;
uavDesc.Format = DXGI_FORMAT_UNKNOWN;
uavDesc.ViewDimension = D3D11_UAV_DIMENSION_BUFFER;
uavDesc.Buffer.FirstElement = 0;
uavDesc.Buffer.Flags = 0;
uavDesc.Buffer.NumElements = count;
if(pDev->CreateUnorderedAccessView(pp->pData,&uavDesc,&pp->pUAV)!=S_OK)
return NULL;
D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
srvDesc.Format = DXGI_FORMAT_UNKNOWN;
srvDesc.ViewDimension = D3D11_SRV_DIMENSION_BUFFER;
srvDesc.Buffer.ElementOffset = 0;
srvDesc.Buffer.ElementWidth = count;
if(pDev->CreateShaderResourceView(pp->pData,&srvDesc,&pp->pSRV)!=S_OK)
return NULL;
The actual writing is done in the compute shader, so the buffer needs to be sent as a UAV:
pDevcon->OMSetRenderTargetsAndUnorderedAccessViews(
0, 0, 0,
start, 1, &p->pUAV, 0
);
And the actual writing: ( Just testing, so some areas might not even give any sense, but for now all that matters is that it's being properly written to )
// Needed resources for decoding
cbuffer CBuffer : register(b0)
{
matrix ViewMatrix;
matrix ProjectionMatrix;
matrix ViewInvMatrix;
matrix ProjectionInvMatrix;
float2 Screen;
float2 pad;
};
// Input resources
// TODO: Single Channel Depth, reconstruct later ( R32_FLOAT )
Texture2D tPosXYZ : register(t0);
Texture2D tNormXYRoughZPostA : register(t1);
Texture2D tDiffXYZ : register(t2);
// Structure
struct GB
{
// World Space Positions
float4 positionWS;
// World Space normals
float4 normalWS;
// Roughness
float roughness;
// Special Post Processing Flag
float post_flag;
};
// Output Buffer
RWStructuredBuffer<GB> bOutput : register(u0);
[numthreads(32, 32, 1)] // Optimum
void main( uint3 DTid : SV_DispatchThreadID )
{
// New GB Instance
GB gb = (GB)0;
gb.positionWS = float4(1,0,0,1);
gb.normalWS = float4(1,0,0,1);
gb.roughness = 1;
gb.post_flag = 1;
bOutput[DTid.y*Screen.x + DTid.x] = gb;
bOutput[0] = gb;
}
Now what on earth have I done wrong this time?
Thank you for your time .
-MIGI0027