2014-03-01 6 views
1

계산 쉐이더에서 깊이 버퍼를 읽을 수 없습니다.Compute 쉐이더에서 깊이 버퍼를 읽을 수 없습니다.

내 hlsl 코드에서 이것을 사용하고 있습니다.

이렇게하면 버퍼를 읽을 수 있습니다.

outputTexture[dispatchThreadId.xy]=gDepthTextures.Load(int3(dispatchThreadId.xy,0)); 

그리고 렌더링 대상에서 깊이 버퍼를 분리합니다.

ID3D11RenderTargetView *nullView[3]={NULL,NULL,NULL}; 
     g_pImmediateContext->OMSetRenderTargets(3, nullView, NULL); 

여전히 출력에서이 오류가 발생합니다.

*D3D11 ERROR: ID3D11DeviceContext::Dispatch: The Shader Resource View dimension declared in the shader code (TEXTURE2D) does not match the view type bound to slot 3 of the Compute Shader unit (BUFFER). This mismatch is invalid if the shader actually uses the view (e.g. it is not skipped due to shader code branching). [ EXECUTION ERROR #354: DEVICE_DRAW_VIEW_DIMENSION_MISMATCH]* 

쉐이더 리소스 뷰를 만드는 방법입니다.

// Create depth stencil texture 
D3D11_TEXTURE2D_DESC descDepth; 
ZeroMemory(&descDepth, sizeof(descDepth)); 
descDepth.Width = width; 
descDepth.Height = height; 
descDepth.MipLevels = 1; 
descDepth.ArraySize = 1; 
descDepth.Format = DXGI_FORMAT_R32_TYPELESS; 
descDepth.SampleDesc.Count = 1; 
descDepth.SampleDesc.Quality = 0; 
descDepth.Usage = D3D11_USAGE_DEFAULT; 
descDepth.BindFlags = D3D11_BIND_DEPTH_STENCIL | D3D11_BIND_SHADER_RESOURCE; 
descDepth.CPUAccessFlags = 0; 
descDepth.MiscFlags = 0; 
hr = g_pd3dDevice->CreateTexture2D(&descDepth, NULL, &g_pDepthStencil); 
if(FAILED(hr)) 
    return hr; 

// Create the depth stencil view 
D3D11_DEPTH_STENCIL_VIEW_DESC descDSV; 
ZeroMemory(&descDSV, sizeof(descDSV)); 
descDSV.Format = DXGI_FORMAT_D32_FLOAT; 
descDSV.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D; 
descDSV.Texture2D.MipSlice = 0; 
hr = g_pd3dDevice->CreateDepthStencilView(g_pDepthStencil, &descDSV,  &g_pDepthStencilView); 
if(FAILED(hr)) 
    return hr; 

// Create depth shader resource view. 
D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc; 
ZeroMemory(&srvDesc,sizeof(D3D11_SHADER_RESOURCE_VIEW_DESC)); 
srvDesc.Format=DXGI_FORMAT_R32_UINT; 
srvDesc.ViewDimension=D3D11_SRV_DIMENSION_TEXTURE2D; 
srvDesc.Texture2D.MostDetailedMip=0; 
srvDesc.Texture2D.MipLevels=1; 


hr=g_pd3dDevice->CreateShaderResourceView(g_pDepthStencil,&srvDesc,&g_pDepthSRV); 
if(FAILED(hr)) 
    return hr; 

나는 모든 형식이 더 성공 텍스처 형식 떠 HLSL, float4, UINT, uint4와 함께 here을 언급 노력했다. 어떤 생각?

답변

0

DXGI_FORMAT_R32_UINT를 DXGI_FORMAT_R32_FLOAT로 바꾸어서 쉐이더 리소스 뷰를 사용하면 R32_Typeless를 사용하기 때문에 부동 소수점 버퍼가 생깁니다.

Texture2D gDepthTextures는 나중에 깊이를로드하거나 샘플링해야하는 텍스처입니다.

또한 텍스처가 계산 쉐이더에 제대로 바인딩되어 있지 않은 것으로 나타납니다 (런타임에 버퍼가 있음을 알려주기 때문에).

당신이이 있는지 확인하십시오 : 당신의 파견하기 전에

immediateContext->CSSetShaderResources(3,1,g_pDepthSRV); 

를 호출합니다.

이러한 유형의 문제를 디버깅하려면 전화하기 전에 파이프 라인의 내용을 확인하려면 CSGetShaderResources (및 기타 동등한 번호)으로 전화 할 수도 있습니다.

+0

여전히 "D3D11 오류 : ID3D11DeviceContext :: Dispatch : 셰이더 코드 (TEXTURE2D)에 선언 된 셰이더 리소스 뷰 차원이 Compute Shader 장치 (BUFFER)의 슬롯 3에 바인딩 된 뷰 형식과 일치하지 않습니다.이 불일치가 잘못되었습니다. 셰이더가 실제로 뷰를 사용하는 경우 (예 : 셰이더 코드 분기로 인해 건너 뛴 것은 아닙니다.) [EXECUTION ERROR # 354 : DEVICE_DRAW_VIEW_DIMENSION_MISMATCH] " –

+0

편집 된 대답은 사용자의 깊이가 디스패치 전에 바인딩되지 않은 것으로 보입니다 (float 형식은 여전히 ​​필요합니다. 귀하의 샘플링 방식). – catflier

+0

나는 파견 직전에 이것을 이미하고있다. "g_pImmediateContext-> CSSetShaderResources (3,1, & g_pDepthSRV);" –

관련 문제