2014-07-25 9 views
0

방금 ​​DirectCompute를 배우기 시작했으며 학습 목적으로 텍스처를 흐리게하는 간단한 회선 필터를 만들고 싶습니다. 나는 다음과 같은 매개 변수를 사용하여 전화컨볼 루션 필터가 잘못된 색상 값을 출력합니다.

Texture2D<float4> inputTex; 
RWTexture2D<float4> outputTex; 

[numthreads(32, 32, 1)] 
void main(uint3 DTid : SV_DispatchThreadID) 
{ 
    float4 totalPixVal = float4(0.0f, 0.0f, 0.0f, 0.0f); 
    for (int y = -3; y < 3; ++y) 
     for (int x = -3; x < 3; ++x) 
      totalPixVal += inputTex.Load(uint3(DTid.x + x, DTid.y + y, DTid.z)); 

    totalPixVal = float4(totalPixVal.xyz/49.0f, 1.0f); 

    float4 inPix  = inputTex.Load(DTid); 
    outputTex[DTid.xy] = totalPixVal; 
} 

:

DeviceContext->Dispatch(inputTexture->Width/32, inputTexture->Height/32, 1); 

이 쉐이더는 평균 색 현재 픽셀의 값과 48 개 이웃 소요 나는 질감을 흐리게하기 위해 다음과 같은 연산 쉐이더를 작성했습니다 이는 흐림 효과를 유발합니다.

흐림 부분이 잘 작동하지만 쉐이더가 출력하는 색상이 올바르지 않습니다. 셰이더를 테스트하기 위해 검정색 배경에 순수한 흰색 모양의 간단한 이미지를 사용하고 있습니다. 내가 예상 한 출력은 검정색 배경에 희미한 순수한 흰색 모양이지만 흰색 모양은 더 이상 흰색이 아니므로 회색입니다. 이제는 코드를 여러 번 읽었지만 문제가있는 곳을 찾을 수 없습니다. 각 텍스처의 크기는 512x512 픽셀입니다.

이 내 입력 이미지 :

Input image

그리고 이것은 내가 얻을 출력 :

Output image

어떤 도움을 크게 감상 할 수있다.

감사합니다 : D

답변

2

에만 36 개 픽셀을 합산하고,하지 49 변경 :

for (int y = -3; y < 3; ++y) 
    for (int x = -3; x < 3; ++x) 

에 :

for (int y = -3; y <= 3; ++y) 
    for (int x = -3; x <= 3; ++x) 
+1

아 그래, 당신 말이 맞아. 고맙습니다! 나는 새로운 계산 쉐이더에 너무 집중했다는 것을 알았습니다. – Krienie