[英]Use Compute Shader to Process the Render Target
我想將渲染目標用作DirectX 11中的Compute Shader的輸入。我只需要讀取Compute Shader中的Render Target,就我而言,我不必渲染Compute Shader輸出(盡管我確實有以便稍后在CPU中使用它,並且可能需要在其他Compute Shader傳遞中對其進行處理。)
我已經看到有評論認為這樣做是可行的,但是我似乎找不到任何示例代碼來顯示如何在“着色器資源視圖”中將渲染目標(Texture2D)用作計算着色器緩沖區。 我嘗試了許多選項,但是無法創建計算機着色器需要作為輸入的着色器資源視圖。
最好指向示例代碼片段的指針。
您的資源確實需要具有可通過計算着色器讀取的着色器資源使用模式:-對於標准渲染目標:D3D11_BIND_SHADER_RESOURCE-對於交換鏈:交換鏈描述中的DXGI_USAGE_SHADER_INPUT。
然后,您只需照常創建着色器資源視圖。
在某種程度上,還可以使緩沖區也可以由計算着色器直接寫入。 在這種情況下,標記為D3D11_BIND_UNORDERED_ACCESS或DXGI_USAGE_UNORDERED_ACCESS(請注意,這不適用於多采樣紋理。)
這是一個非常簡單的計算着色器,可從UV坐標讀取紋理中的樣本:
RWStructuredBuffer<float4> rwbuffer;
//Render target previously rendered
Texture2D tex;
//Buffer containing uvs for sampling
StructuredBuffer<float2> uv <string uiname="UV Buffer";>;
SamplerState mySampler : IMMUTABLE
{
Filter = MIN_MAG_MIP_LINEAR;
AddressU = Clamp;
AddressV = Clamp;
};
[numthreads(1, 1, 1)]
void CS( uint3 i : SV_DispatchThreadID)
{
//Read color and write to buffer
rwbuffer[i.x] = tex.SampleLevel(mySampler,uv[i.x],0);
}
technique11 Process
{
pass P0
{
SetComputeShader( CompileShader( cs_5_0, CS() ) );
}
}
希望能有所幫助。
從紋理創建着色器資源視圖的第一個要求是創建帶有良好標記的紋理。 標志是D3D11_BIND_SHADER_RESOURCE
。 在調用CreateTexture2D之前,必須在解密綁定成員中設置它。
如果渲染目標不是您創建的,而是由交換鏈創建的,則您不能將其綁定為SRV。 您將需要一個中間幀緩沖區,並將其復制到幀末尾的后台緩沖區。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.