Chúng tôi đang gặp một số vấn đề với việc dò tia của chúng tôi trong DirectX, đặc biệt là với một số vấn đề về dải nghiêm trọng với đặc điểm kỹ thuật. Với sức mạnh đầu cơ cao (trên 8) bắt đầu dải. Tôi đang tự hỏi liệu đây có phải là sự cố HDR / LDR hay có thể liên quan đến vấn đề khác, chẳng hạn như quy tắc hoặc các vectơ khác không?
CẬP NHẬT
Nhìn bên dưới để cập nhật.
Đây là mã shader có liên quan cho Blinn-Phong trên một hình cầu:
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 bằng 8 trong hình ảnh này
specPower bằng 9 trong hình ảnh này
Đây có phải là đơn giản như một vấn đề HDR / LDR hoặc nó bằng cách nào đó liên quan đến độ chính xác bình thường? Tôi tin rằng tôi đã gặp phải vấn đề này trước đây trong một trình kết xuất bị trì hoãn trong đó các thông số có độ chính xác thấp và được đóng gói / giải nén không đúng cách nhưng trong trường hợp này, các quy tắc được tạo ra một cách nhanh chóng và toàn bộ mọi thứ được đưa trực tiếp vào bộ đệm.
Cập nhật 1
Tôi muốn thêm vào ở trên rằng các hình tam giác phải chịu cùng một tạo tác và chúng có hiện tại bình thường theo cách sau:
float3 normal = normalize(cross(triangles[bestHit.hitID].vertices[1] - triangles[bestHit.hitID].vertices[0],
triangles[bestHit.hitID].vertices[2] - triangles[bestHit.hitID].vertices[0]));
Tôi muốn nói điều này làm cho nhiều khả năng rằng sự bình thường của bề mặt là vấn đề. Hình ảnh sau đây cho thấy những gì xảy ra khi specPower đạt 2048.
spec
trực tiếp và cả max(dot(normal, h), 0.0f)
. Hãy tìm giá trị này cho giá trị 1 trong cả hai phép tính.
float3 h = normalize( reflect(toLight,normal) );
vàspec = pow(dot(v, h) * 0.5 + 0.5, specPower) * diffuse;