I'm trying to implement Order Independent Transparency in DX11 as described here , but I've got stuck with following problem: It seems that my app is unable to bind UnorderedAccessView to proper slot of the pixel shader. (I'm using DX11 Effect framework for shaders...)
Although I think I bind them correctly, I'm getting this debug message:
D3D11: INFO: ID3D11DeviceContext::DrawIndexed: The Pixel Shader unit expects an Unordered Access View at Slot 0, but none is bound. This is OK, as reads of an unbound Unordered Access View are defined to return 0 and writes are ignored. It is also possible the developer knows the data will not be used anyway. This is only a problem if the developer actually intended to bind a Unordered Access View here. [ EXECUTION INFO #2097374: DEVICE_UNORDEREDACCESSVIEW_NOT_SET ]
[/quote]
relevant pixel shader part (just write value of 5 to every affected pixel...), compiled under ps_5_0:
...
RWByteAddressBuffer OIT_StartOffsetBuffer : register( u0 );
[earlydepthstencil]
void PS_StoreFragments( PS_INPUT input)
{
uint x = input.position.x;
uint y = input.position.y;
// Read and update Start Offset Buffer.
uint uIndex = y * iScreenWidth + x; // get offset from position
uint uStartOffsetAddress = 4 * uIndex;
uint uOldStartOffset;
OIT_StartOffsetBuffer.InterlockedExchange( uStartOffsetAddress, 5, uOldStartOffset );
return;
}
...
Here is how my app is trying to bind the UAVs:
ID3D11RenderTargetView* pViewNULL[ 1 ] = { NULL };
ID3D11DepthStencilView* pDSVNULL = NULL;
m_pDevCon->OMSetRenderTargets( 1, pViewNULL, pDSVNULL );
ID3D11UnorderedAccessView * apUAVs[1] = { m_pDX_UAV };
// Initialize UAV counters
UINT initCounters[] = { 0 };
// bind render targets & UAVs m_pDevCon->OMSetRenderTargetsAndUnorderedAccessViews(0,NULL, NULL, 0, 1, &(apUAVs[0]), initCounters);
Here is how I create m_pDX_UAV:
bool CreateUAV(UINT uiWidth, UINT uiHeight, UINT uiItemByteSize)
{
uiWidth = max(1,uiWidth);
uiHeight = max(1,uiHeight);
lx_uint32 itemCount = uiWidth * uiHeight;
uiByteSize = itemCount * uiItemByteSize;
// create buffer
D3D11_BUFFER_DESC descBuf;
memset( &descBuf, 0, sizeof( descBuf ) );
descBuf.StructureByteStride = uiItemByteSize;
descBuf.ByteWidth = uiByteSize;
descBuf.MiscFlags = D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS;
descBuf.BindFlags = D3D11_BIND_UNORDERED_ACCESS | D3D11_BIND_SHADER_RESOURCE;
if (FAILED( m_pDev->CreateBuffer( &descBuf, NULL, &m_pDX_Buffer ) ))
{
return false;
}
// create UAV
D3D11_UNORDERED_ACCESS_VIEW_DESC descUAV;
memset( &descUAV, 0, sizeof( descUAV ) );
descUAV.ViewDimension = D3D11_UAV_DIMENSION_BUFFER;
descUAV.Buffer.FirstElement = 0;
descUAV.Format = DXGI_FORMAT_R32_TYPELESS;
descUAV.Buffer.NumElements = itemCount;
descUAV.Buffer.Flags = D3D11_BUFFER_UAV_FLAG_RAW;
if (FAILED( m_pDev->CreateUnorderedAccessView( m_pDX_Buffer, &descUAV, &m_pDX_UAV ) ))
{
return false;
}
// create SRV
D3D11_SHADER_RESOURCE_VIEW_DESC descSRV;
descSRV.ViewDimension = D3D11_SRV_DIMENSION_BUFFER;
descSRV.Buffer.FirstElement = 0;
descSRV.Buffer.NumElements = itemCount;
descSRV.Format = DXGI_FORMAT_R32_UINT;
descSRV.BufferEx.Flags = D3D11_BUFFEREX_SRV_FLAG_RAW;
descSRV.BufferEx.FirstElement =0;
descSRV.BufferEx.NumElements = itemCount;
if (FAILED( m_pDev->CreateShaderResourceView( m_pDX_Buffer, &descSRV, &m_pDX_SRV ) ))
{
return false;
}
return true;
}
Does anybody have any idea, why is this happening? Is the binding of UAVs to shader and applying shader pass via: ID3DX11EffectPass::Apply(...) order sensitive? (now I first bind UAVs and then ::Apply() shader.). Do I need to bind DepthStencilView?
Thanks for any suggestion.