2014-04-03 20 views
1

我在像素着色器中做了一些紋理的實驗,通過在像素着色器上寫入一些值,但在下一次繪製調用時我沒有看到它的效果,當我將相同的紋理再次綁定爲一個SRV。用像素着色器在無人機上書寫

實施例的着色器:

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

如果需要我可以提供應用程序的源代碼。

+1

還提供相關的資源創建和綁定代碼。使用圖形調試器(Visual Studio One,Nvidia Nsight,AMD PerfStudio等)檢查資源並上傳屏幕截圖。可能是一個整數格式的'RWTexture2D '一個問題?紋理格式是否兼容?是否啓用調試層並且輸出中沒有警告?你是否正確解除綁定UAV /渲染目標? – Drop

+0

您是否驗證過無人機由PS1正確設置? (可以使用圖形調試器,也可以使用額外的代碼 - 清零,用PS1繪製,複製到分段,映射進行讀取,檢查pData) – MooseBoys

回答

0

我啓用了調試層。這是無人機格式不匹配錯誤。在UAV描述中,我將R8G8B8A8_UNORM聲明爲一種格式,我在着色器中將元素作爲UINT訪問。

描述:D3D11 ERROR:ID3D11DeviceContext ::消耗:對於組分0的資源返回類型在着色器代碼(UINT)聲明不與結合到像素着色器單元的無序Access視圖插槽1中的資源類型兼容(UNORM)。這種不一致是無效的,如果着色器實際使用的觀點[執行錯誤#2097372:DEVICE_UNORDEREDACCESSVIEW_RETURN_TYPE_MISMATCH]

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

通過分段資源質地傾銷證實。多謝你們。