Saya telah bermain-main dengan pemetaan bayangan di OpenGL menggunakan tekstur kedalaman. Tekstur kedalamannya baik-baik saja dan saya bisa memetakannya ke tempat kejadian tetapi saya memiliki beberapa artefak aneh di belakang objek:
Pertanyaan saya adalah apa yang menyebabkan ini dan bagaimana saya bisa memperbaikinya?
Shader fragmen yang saya gunakan cukup mudah (saya menghapus warna untuk kesederhanaan jika Anda bertanya-tanya mengapa tidak ada biru di sini):
in vec4 vShadowCoord;
uniform sampler2DShadow shadowMap;
out vec4 fragColor;
void main()
{
float bias = 0.005;
float visibility = 1.0;
if (texture(shadowMap, vec3(vShadowCoord.xy, vShadowCoord.z / vShadowCoord.w)) < (vShadowCoord.z - bias) / vShadowCoord.w)
visibility = 0.25;
fragColor = vec4(visibility);
}
Sunting: Seperti yang diminta, tangkapan layar contoh kerja minimum yang hanya menggunakan kode di atas (tidak ada warna).
opengl
glsl
shadow-mapping
shadow
Blarglenarf
sumber
sumber
Jawaban:
Masalah ini terlihat seperti artefak jerawat bayangan peta standar. Selain itu persamaan pencahayaan Anda tidak lengkap atau salah. Cahaya seharusnya tidak memengaruhi wajah dengan normals yang menghadapinya. Ini juga berarti bahwa dengan persamaan yang tepat, sisi "gelap" bola seharusnya tidak memiliki artefak jerawat.
Ada tiga sumber artefak jerawat:
Singkatnya, frustum yang ketat dengan beberapa kaskade dan beberapa penyesuaian bias sudah cukup untuk membuat case umum bekerja (directional light). Mulai tweaker dengan menonaktifkan filter bayangan dan tweak untuk memfilter hanya ketika peta bayangan dasar cukup kuat.
Selain terlepas dari bias kedalaman konstan (yang saat ini Anda gunakan), Anda juga harus menambahkan bias kedalaman lereng dan bias kedalaman lereng maksimum. Keduanya dapat diimplementasikan baik sebagai status render atau sebagai kode shader selama rendering shadowmap. Bias kedalaman lereng hanyalah nilai bias ajaib yang diskalakan dengan titik (normal, lightDir).
Ada beberapa metode tambahan yang menarik dan sebagian besar diimplementasikan dalam demo yang sangat baik: Matt Pettineo - "Contoh teknik bayangan" .
sumber