XNA 4에서 게임을하고 있는데 최근 이 안내서에 따라 지연된 음영 구현으로 전환했습니다 . 내 모델에 이상한 흰색 윤곽선이 나타나고 있는데이 원인이 무엇인지 잘 모르겠습니다. 일반 렌더 타겟 또는 뎁스 렌더 타겟의 정밀도가 떨어졌을 수도 있지만 32 (컬러) 대신 64 비트 (Rgba64)로 늘리면 도움이되지 않습니다. 또한 스페 큘러 계산에 문제가 있다고 생각하여 스페 큘러를 0으로 설정하려고 시도했지만 도움이되지 않았습니다. PIX에서 픽셀을 디버깅하면 확산 값이 해당 픽셀에 대해 거의 흰색으로 계산됩니다. 어떤 아이디어? 아래에 문제의 그림이 포함되어있어 전체 크기로보기가 더 쉽습니다.
픽셀 쉐이더 :
float4 PixelShaderFunction(VertexShaderOutput input) : COLOR0
{
input.ScreenPosition.xy /= input.ScreenPosition.w;
float2 texCoord = 0.5f * (float2(input.ScreenPosition.x, -input.ScreenPosition.y) + 1) - halfPixel;
float4 normalData = tex2D(normalSampler, texCoord);
//Transform normal back into [-1, 1] range
float3 normal = normalize(2.0f * normalData.xyz - 1.0f);
float specularPower = normalData.a;
float specularHardness = tex2D(colorSampler, texCoord).a * 255;
float depthVal = tex2D(depthSampler, texCoord).r;
//Compute screen-space position
float4 position = float4(input.ScreenPosition.xy, depthVal, 1.0f);
//Transform to world space
position = mul(position, InvertViewProjection);
position /= position.w;
//Surface-to-light vector
float3 lightVector = lightPosition - position;
float3 projectedTexCoords = position - lightPosition;
projectedTexCoords = mul(projectedTexCoords, float3x3(
float3(-1, 0, 0),
float3(0, 1, 0),
float3(0, 0, 1)));
float distanceToLight = length(lightVector) / lightRadius;
float shadow = ShadowContribution(projectedTexCoords, distanceToLight);
float attenuation = saturate(1.0f - distanceToLight);
lightVector = normalize(lightVector);
//Compute diffuse light
float normalDotLight = max(0, dot(normal, lightVector));
float3 diffuseLight = normalDotLight * Color.rgb;
float3 reflectionVector = normalize(reflect(-lightVector, normal));
float3 directionToCamera = normalize(cameraPosition - position);
float specularLight = specularPower * pow(saturate(dot(reflectionVector, directionToCamera)), specularHardness);
return shadow * attenuation * lightIntensity * float4(diffuseLight.rgb, specularLight);
}
편집 : JPG에 대해 죄송합니다. stackexchange의 업 로더가 자체적으로 수행했습니다. Roy T : XNA3에서 변경된 부분에 대한 튜토리얼의 XNA4 변환을 실제로 참조했습니다. 코드를 크게 변경하지 않았기 때문에이 버그는 원래 존재했지만 너무 많은 조명이 모두 움직이는 것으로 볼 수는 없다고 생각했기 때문에 하나의 조명을 제외한 모든 조명을 제거하고 버그가 다시 나타났습니다 (보기 도마뱀 팔꿈치 근처)
내 장면의 GBuffer 내용은 다음과 같습니다.
컬러 버퍼 : 깊이 버퍼 : 일반 버퍼 : 최종 렌더링 :
편집 2 :
컬러 맵을 샘플링 할 때 문제가 CombineFinal.fx라고 의심되기 시작합니다. 이것은 흰색 픽셀 바로 옆에 올바르게 채색 된 픽셀에 대한 계산입니다.
diffuseColor : (0.435, 0.447, 0.412)
diffuseLight : (1.000, 1.000, 0.902)
light : (1.000, 1.000, 0.902, 0.000)
PixelShaderFunction : (0.435, 0.447, 0.371, 1.000)
specularLight : 0.000
그리고 이것은 바로 옆에 부적절한 색상의 흰색 픽셀의 출력입니다.
diffuseColor : (0.824, 0.792, 0.741)
diffuseLight : (1.000, 1.000, 0.902)
light : (1.000, 1.000, 0.902, 0.000)
PixelShaderFunction : (0.824, 0.792, 0.669, 1.000)
specularLight : 0.000
spreadColor는 유일한 차이점이며이 색상은 색상 맵에서 직접 가져옵니다. 샘플링 할 텍스처 좌표 계산에 약간의 오류가 있습니까?
조명 패스 :