Writing on a UAV in pixel shader
我通过在像素着色器上写入一些值来对作为UAV的纹理进行一些实验,但是当我再次绑定相同的纹理作为SRV时,在下一个绘制调用中没有看到其效果。
着色器示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | RWTexture2D<unsigned int> uav; Texture2D tex : register(t0); // Vertex Shader float4 VS( float4 Pos : POSITION ) : SV_POSITION { return Pos; } // Pixel Shader, draw1 warm up float4 PS( float4 Pos : SV_POSITION ) : SV_Target { return float4( 1.0f, 1.0f, 0.0f, 1.0f ); // Yellow, with Alpha = 1 } // Pixel Shader, we are writing onto the texture by binding it as an UAV, draw2 float4 PS1( float4 Pos : SV_POSITION ) : SV_Target { if((Pos.x %2) && (Pos.y %2)) { uav[Pos.xy]=0xFF000000; //some color } else { uav[Pos.xy]=0x00FF0000; //some color } return float4( 1.0f, 0.0f, 0.0f, 1.0f ); } // Pixel Shader, here we are accessing texture as an SRV, draw3 float4 PS2( float4 Pos : SV_POSITION ) : SV_Target { float4 x = tex[Pos.xy]; return x; } |
如果需要,我可以提供应用程序源代码。
我启用了调试层。 这是UAV格式不匹配错误。 在UAV描述中,我声明R8G8B8A8_UNORM为一种格式,并且在着色器中以UINT形式访问元素。
说明:D3D11错误:ID3D11DeviceContext :: Draw:在着色器代码(UINT)中声明的组件0的资源返回类型与绑定到Pixel Shader单元(UNORM)的无序访问视图插槽1的资源类型不兼容。 如果着色器实际使用视图,则此不匹配无效[EXECUTION ERROR#2097372:DEVICE_UNORDEREDACCESSVIEW_RETURN_TYPE_MISMATCH]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | Source code: D3D11_UNORDERED_ACCESS_VIEW_DESC UAVdesc; ZeroMemory( &SRVdesc, sizeof(SRVdesc)); UAVdesc.Format=DXGI_FORMAT_R8G8B8A8_UNORM; UAVdesc.ViewDimension=D3D11_UAV_DIMENSION_TEXTURE2D; UAVdesc.Texture2D.MipSlice=0; g_pd3dDevice->CreateUnorderedAccessView( g_pTexture, &UAVdesc, &g_pUAV); Texture created : D3D11_TEXTURE2D_DESC TextureData; ZeroMemory( &TextureData, sizeof(TextureData) ); TextureData.ArraySize=1; TextureData.Height=height; TextureData.Width=width; TextureData.Format=DXGI_FORMAT_R8G8B8A8_TYPELESS; TextureData.CPUAccessFlags=0; TextureData.BindFlags=D3D11_BIND_SHADER_RESOURCE|D3D11_BIND_RENDER_TARGET|D3D11_BIND_UNORDERED_ACCESS; TextureData.MipLevels=1; TextureData.MiscFlags=0; TextureData.SampleDesc.Count=1; TextureData.SampleDesc.Quality=0; TextureData.Usage=D3D11_USAGE_DEFAULT; D3D11_SUBRESOURCE_DATA InitialData; ZeroMemory( &InitialData, sizeof(InitialData)); InitialData.pSysMem=pData; InitialData.SysMemPitch=width * sizeof(UINT); InitialData.SysMemSlicePitch=width * sizeof(UINT) * height; g_pd3dDevice->CreateTexture2D( &TextureData, &InitialData, &g_pTexture); Shader code is already given above. Fix: D3D11_UNORDERED_ACCESS_VIEW_DESC UAVdesc; ZeroMemory( &SRVdesc, sizeof(SRVdesc)); **UAVdesc.Format=DXGI_FORMAT_R32_UINT;** UAVdesc.ViewDimension=D3D11_UAV_DIMENSION_TEXTURE2D; UAVdesc.Texture2D.MipSlice=0; g_pd3dDevice->CreateUnorderedAccessView( g_pTexture, &UAVdesc, &g_pUAV); |
通过在暂存资源中转储纹理来确认。 谢谢你们。