Tôi đang làm việc với một trò chơi trong XNA 4 và gần đây tôi đã chuyển sang triển khai tạo bóng hoãn lại sau hướng dẫn này . Một phác thảo màu trắng kỳ lạ đang hiển thị trên các mô hình của tôi bây giờ và tôi không chắc điều gì gây ra điều này. Tôi nghĩ có lẽ đó là sự thiếu chính xác đối với mục tiêu kết xuất bình thường hoặc mục tiêu kết xuất độ sâu nhưng việc tăng chúng lên 64 bit (Rgba64) thay vì 32 (Màu) không giúp ích được gì. Tôi cũng nghĩ rằng nó có thể là một số vấn đề với tính toán đầu cơ nên tôi đã thử đặt giá trị đầu ra thành 0 nhưng điều đó cũng không giúp được gì. Gỡ lỗi pixel trong PIX cho thấy giá trị khuếch tán đang được tính gần như trắng cho pixel đó. Có ý kiến gì không? Tôi đã bao gồm một hình ảnh của vấn đề dưới đây, dễ dàng hơn để nhìn thấy nó ở kích thước đầy đủ.
Pixel Shader:
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);
}
Chỉnh sửa : Xin lỗi về JPG, trình tải lên của stackexchange đã tự mình làm điều đó. Roy T: Tôi thực sự đã tham khảo chuyển đổi XNA4 của bạn về hướng dẫn cho các phần đã thay đổi từ XNA3. Vì tôi không thực hiện bất kỳ thay đổi lớn nào đối với mã, tôi nghĩ có thể lỗi này tồn tại trong bản gốc nhưng không thể nhìn thấy với rất nhiều ánh sáng di chuyển xung quanh, vì vậy tôi đã loại bỏ tất cả trừ một ánh sáng và lỗi lại xuất hiện (nhìn gần khuỷu tay của thằn lằn)
Dưới đây là nội dung GBuffer cho cảnh của tôi:
Bộ đệm màu: Bộ đệm sâu: Bộ đệm thông thường: Kết xuất cuối cùng:
Chỉnh sửa2 :
Tôi bắt đầu nghi ngờ vấn đề là CombineFinal.fx khi nó lấy mẫu bản đồ màu. Đây là tính toán cho pixel có màu đúng ngay bên cạnh pixel trắng:
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
Và đây là đầu ra từ một pixel trắng không đúng màu ngay bên cạnh nó:
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
DiffuseColor là sự khác biệt duy nhất và màu này được lấy trực tiếp từ bản đồ màu. Có lẽ có một lỗi nhỏ trong tính toán của tọa độ kết cấu để lấy mẫu từ?
Đèn chiếu sáng: