Kami mengalami beberapa masalah dengan penelusuran ray kami di DirectX, terutama dengan beberapa masalah pita serius dengan specular. Dengan daya spekulan tinggi (di atas 8) dimulai. Saya ingin tahu apakah ini masalah HDR / LDR atau dapat dikaitkan dengan hal lain, seperti normals atau vektor lainnya?
MEMPERBARUI
Lihat di bawah untuk pembaruan.
Inilah kode shader yang relevan untuk Blinn-Phong dalam sebuah lingkup:
float3 hitPoint = thisRay.origin + thisRay.direction * bestHit.hitT;
float3 normal = normalize(hitPoint - spheres[bestHit.hitID].center);
float3 toLight = pointLights[0].position.xyz - hitPoint;
float d = length(toLight);
toLight = normalize(toLight);
float diffuse = max(dot(normal, toLight), 0.0f);
float3 v = normalize(thisRay.origin - hitPoint);
float3 h = normalize(v + toLight);
float spec = 0;
if (diffuse > 0)
spec = pow(max(dot(normal, h), 0.0f), specPower) * diffuse;
output[threadID.xy] = spheres[bestHit.hitID].colour * diffuse + spheres[bestHit.hitID].specColour * spec;
specPower sama dengan 8 di gambar ini
specPower sama dengan 9 di gambar ini
Apakah ini sesederhana masalah HDR / LDR atau apakah itu terkait dengan presisi normal? Saya percaya saya pernah mengalami masalah ini sebelumnya di penyaji ditangguhkan di mana normals dari presisi rendah dan tidak benar dikemas / dibongkar tetapi dalam hal ini normals dihasilkan dengan cepat dan semuanya diserahkan langsung ke backbuffer.
Perbarui 1
Saya ingin menambahkan di atas bahwa segitiga menderita artefak yang sama dan mereka memiliki normal saat ini dihasilkan dengan cara berikut:
float3 normal = normalize(cross(triangles[bestHit.hitID].vertices[1] - triangles[bestHit.hitID].vertices[0],
triangles[bestHit.hitID].vertices[2] - triangles[bestHit.hitID].vertices[0]));
Saya akan mengatakan ini membuatnya semakin tidak mungkin bahwa masalah normal adalah permukaannya. Gambar berikut ini menunjukkan apa yang terjadi ketika specPower mencapai 2048.
spec
secara langsung, dan juga max(dot(normal, h), 0.0f)
. Cari pengembalian ini ke nilai 1 dalam perhitungan mana pun.
float3 h = normalize( reflect(toLight,normal) );
, danspec = pow(dot(v, h) * 0.5 + 0.5, specPower) * diffuse;