2017-10-29 24 views
1

내가 shader.Here 내 코드의 일부 픽셀에서 그것을 달성하기 위해 생각하고있다 : 첫째전체 픽셀 쉐이더 스테이지에서 컬러가 사용 된 시간을 효율적으로 계산하는 방법은 무엇입니까?

, 나는 색상 테이블로

D3D11_TEXTURE1D_DESC t1d; 
t1d.Width = ModelInfo::ColorCount; 
t1d.ArraySize = 1; 
t1d.MipLevels = 1; 
t1d.CPUAccessFlags = 0; 
t1d.MiscFlags = 0; 
t1d.Format = DXGI_FORMAT_R32G32B32A32_FLOAT; 
t1d.Usage = D3D11_USAGE_DEFAULT; 
t1d.BindFlags = D3D11_BIND_SHADER_RESOURCE; 

ZeroMemory(&InitData, sizeof(InitData)); 
InitData.pSysMem = ModelInfo::Colors; 

hr = m_D3DDevice->CreateTexture1D(&t1d, &InitData, &m_ColorTable); 
if (FAILED(hr)) 
    return hr; 

D3D11_SHADER_RESOURCE_VIEW_DESC viewDesc; 
viewDesc.Format = DXGI_FORMAT_R32G32B32A32_FLOAT; 
viewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE1D; 
viewDesc.Texture1D.MostDetailedMip = 0; 
viewDesc.Texture1D.MipLevels = 1; 
hr = m_D3DDevice->CreateShaderResourceView(m_ColorTable, &viewDesc, &m_ColorResView); 
if (FAILED(hr)) 
    return hr; 

을 Texture1D를 만든 다음 나는 픽셀 쉐이더에 전달 픽셀 셰이더

m_ImmediateContext->PSSetShaderResources(0, 1, &m_ColorResView);

은이 같은 색이 표를 사용

01,230,210,189,

나는 색상이 전체 픽셀 쉐이더 단계에서 사용하는 횟수를 계산하려면이 색상 표에서 각 색상의 알파 채널을 사용하려면 ...

나는 픽셀 쉐이더에서 색상 표를 수정하려면 아래 코드와 같습니다.하지만 실행 불가능한 것 같습니다.

나는 텍스처를 렌더링하고 C++을 사용하여 CPU에서 카운트하는 대신 효율적으로 색상을 계산하는 방법을 찾고 있습니다.

내가 생각한 모든 방법은 텍스처를 렌더링해야한다고 생각하는 메소드 외에도 x ++ (gpu의 일부 병렬 문제)와 같은 작업을 수행하기가 어렵 기 때문에 CPU에서 일부 계산 작업을 수행해야한다고 생각했습니다. 두 번 속도가 느려질 수 있습니다 cpu에 그것을 바로 계산합니다.

오랫동안 파고 있습니다.하지만 사용하지 마십시오. 도움을 주거나이를 달성하는 방법을 알려주십시오.

+0

셰이더 입력을 변경할 수있는 방법이 없습니다. 출력을 지정할 수는 있지만 사용자의 경우에는 작동하지 않습니다. 하나의 옵션은 인덱스를 특수 렌더 타겟에 렌더링 한 다음 CPU에서 인덱스를 계산하지만 오버 드로는 고려하지 않을 수도 있습니다. – Gnietschow

+0

@ Gnietschow 나는 계산 과정을 가속화 할 수 있다고 생각하면서 지수를 계산하기 위해 GPU를 사용하려고했습니다. 어떻게 든 병렬 문제는 x ++ (변수 읽기 및 증가)와 같은 연산을 수행하는 것이 어렵다는 것을 발견했습니다. 좌절했다. (..... – BlauHimmel

+0

픽셀 쉐이더에서 버퍼에 쓰려면 UAV를 사용해야합니다. AtomicIncrement를 사용하면 셀 수를 계산할 수 있습니다. – galop1n

답변

0

픽셀 쉐이더에 작은 쓰기 버퍼를 첨부 할 수 있으며 (정렬되지 않은보기 사용) 픽셀 쉐이더에서 원자 연산을 사용할 수 있습니다. 여기

내가 StructuredBuffer를 사용하여 여기에 수정 된 HLSL 코드

Texture1D RandomTex : register(t0); 

RWStructuredBuffer<uint> RWColorCountData : register(u1); 

float4 PS(VS_OUTPUT Input, uint Primitive : SV_PrimitiveID) : SV_Target 
{ 
    uint Index = Primitive % ColorCount.x; 
    InterlockedAdd(RWColorCountData[Index], 1); 
    return RandomTex[Index]; 
} 

이지만, 당신이 선호하는 경우도 ByteAddressBuffer을 사용할 수 있습니다. 또한 리소스가 u1 레지스터에 연결되어 있습니다. 첫 번째 슬롯은 렌더링 대상에서 계속 가져옵니다.

OMSetRenderTargetsAndUnorderedAccessViews

모든 프레임과 같은 요소는 당신의 1D 텍스처로 계산하고 (대상 렌더링의 상단에) 파이프 라인에 부착 할 필요가 있어야 당신의 쓰기 버퍼, 당신은 또한 삭제해야합니다 귀하의 버퍼를 다시 0 (필요한 경우), 그렇지 않으면, 당신이 사용할 수있는 시간이 지남에 따라 값이 증가합니다. ClearUnorderedAccessViewUint

귀하의 경우에는 uint 버퍼를 사용하고 있으므로 함수는 UINT 값 [4] 값 [0] 만 명확한 값으로 사용됩니다.