2014-04-03 5 views
1

픽셀 쉐이더에서 UAV와 같은 텍스처를 사용하여 약간의 실험을하고 있었지만, 같은 텍스처를 다시 바인딩 할 때 다음 드로잉 호출에서 그 효과를 볼 수는 없습니다. SRV.UAV에서 픽셀 쉐이더로 작성하기

예 쉐이더 : 필요한 경우

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

UAV가 PS1에 의해 올바르게 설정되어 있는지 확인 했습니까? (그래픽 디버거를 사용하거나 여분의 코드가있는 경우 0으로 설정, PS1로 그리기, 스테이징으로 복사, 읽기 맵핑, pData 검사) – MooseBoys

답변

0

디버그 레이어를 활성화했습니다. UAV 형식 불일치 오류였습니다. UAV 설명에서 R8G8B8A8_UNORM을 형식으로 선언했으며 셰이더에서 UINT로 요소에 액세스하고 있습니다.

설명 : D3D11 오류 : ID3D11DeviceContext :: 그리기 : 셰이더 코드 (UINT)에 선언 된 구성 요소 0 자원의 반환 형식은 픽셀 쉐이더 유닛의 정렬되지 않은 액세스보기 슬롯 1에 바인딩 자원 유형과 호환되지 않습니다 (UNORM). 스테이징 자원에 텍스처를 덤핑 의해 확인

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

: 셰이더 실제로보기 [DEVICE_UNORDEREDACCESSVIEW_RETURN_TYPE_MISMATCH 실행 ERROR 번호 2,097,372]를 사용하는 경우이 불일치가 유효하다. 고마워.