关于DirectEX:在像素着色器中的UAV上书写

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);

通过在暂存资源中转储纹理来确认。 谢谢你们。