Saya sedang mengerjakan sebuah game di XNA 4 dan saya baru-baru ini beralih ke implementasi bayangan yang ditunda mengikuti panduan ini . Garis putih aneh muncul di model saya sekarang dan saya tidak yakin apa yang menyebabkan ini. Saya pikir mungkin itu kurang presisi pada target render normal atau target render kedalaman tetapi meningkatkannya menjadi 64 bit (Rgba64), bukannya 32 (Warna) tidak membantu. Saya juga berpikir mungkin ada masalah dengan perhitungan specular jadi saya mencoba mengatur specular ke 0 tetapi itu tidak membantu. Debugging piksel dalam PIX menunjukkan nilai difus sedang dihitung hampir putih untuk piksel itu. Ada ide? Saya menyertakan gambar masalah di bawah ini, lebih mudah untuk melihatnya dalam ukuran penuh.
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);
}
Sunting : Maaf tentang JPG, pengunggah stackexchange melakukannya sendiri. Roy T: Saya benar-benar merujuk konversi XNA4 Anda dari tutorial untuk bagian-bagian yang berubah dari XNA3. Karena saya tidak membuat perubahan besar pada kode saya pikir mungkin bug ini ada dalam aslinya tetapi tidak mungkin untuk melihat dengan begitu banyak lampu semua bergerak di sekitar, jadi saya menghapus semua kecuali satu lampu dan bug muncul lagi (lihat dekat siku kadal)
Berikut adalah konten GBuffer untuk adegan saya:
Penyangga Warna: Penyangga Mendalam: Penyangga Normal: Penyedia Final:
Sunting2 :
Saya mulai curiga masalahnya adalah CombineFinal.fx ketika sampel peta warna. Ini adalah perhitungan untuk piksel berwarna yang benar tepat di sebelah piksel putih:
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
Dan ini adalah output dari piksel putih berwarna tidak langsung tepat di sebelahnya:
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
DifuseColor adalah satu-satunya perbedaan, dan warna ini diambil langsung dari peta warna. Mungkin ada sedikit kesalahan dalam perhitungan koordinat tekstur untuk sampel dari?
Pass pencahayaan:
Jawaban:
Saya memiliki garis putih atau "halo" di sekitar model saya juga, ketika saya mulai dengan penyaji saya sendiri. Masalahnya adalah bahwa nilai offset tekstur untuk overlay target render tidak diatur dengan benar. Beberapa tekstur perlu disetel ke +0,5 piksel untuk offset, bukan -0,5 piksel.
Hanya setelah mengutak-atik nilai dari beberapa tekstur offset yang garis hilang. Kemungkinan besar itu ada di salah satu shader pencahayaan.
Sunting: omong-omong saya juga belajar dari tutorial Catalin Zima yang merupakan cabang dari contoh Anda, jadi itu harus bekerja.
sumber
Saya tidak yakin persis apa yang terjadi, tetapi beberapa hal untuk diperiksa:
Pastikan penyaringan tekstur Anda dimatikan saat mengambil sampel G-buffer - tidak ada bilinear atau anisotropik atau apa pun.
Saya melihat Anda menambahkan offset setengah piksel ke koordinat tekstur; periksa kembali apakah itu benar. Saya tidak cukup terbiasa dengan XNA untuk mengetahui apa yang harus diimbangi dengan benar, tetapi Anda harus dapat memeriksanya dengan menulis shader yang mengambil sampel salah satu buffer-G dan hanya menampilkan sampel. Kemudian, bolak-balik di antara ini dan menampilkan buffer-G langsung di layar. Jika Anda mendapatkan offset yang benar, Anda seharusnya tidak melihat perbedaan, bahkan satu piksel pun.
sumber