software raytrace: correctly handle backface lighting

This commit is contained in:
Turánszki János
2022-01-22 21:29:57 +01:00
parent 2b895c38da
commit ff8a317e17
5 changed files with 20 additions and 1 deletions
@@ -115,6 +115,11 @@ void main(uint3 DTid : SV_DispatchThreadID, uint3 Gid : SV_GroupID, uint groupIn
ray.Origin = ray.Origin + ray.Direction * hit.distance;
hit_depth = hit.distance;
if (hit.is_backface)
{
surface.flags |= SURFACE_FLAG_BACKFACE;
}
if (!surface.load(hit.primitiveID, hit.bary))
break;
+5
View File
@@ -128,6 +128,11 @@ void main(uint3 DTid : SV_DispatchThreadID, uint groupIndex : SV_GroupIndex)
// ray origin updated for next bounce:
ray.Origin = ray.Origin + ray.Direction * hit.distance;
if (hit.is_backface)
{
surface.flags |= SURFACE_FLAG_BACKFACE;
}
if (!surface.load(hit.primitiveID, hit.bary))
return;
+4
View File
@@ -50,6 +50,7 @@ struct RayHit
float2 bary;
float distance;
PrimitiveID primitiveID;
bool is_backface;
};
inline RayHit CreateRayHit()
@@ -57,6 +58,7 @@ inline RayHit CreateRayHit()
RayHit hit;
hit.bary = 0;
hit.distance = FLT_MAX;
hit.is_backface = false;
return hit;
}
@@ -102,6 +104,7 @@ inline void IntersectTriangle(
hit.distance = t;
hit.primitiveID = prim.primitiveID();
hit.bary = float2(u, v);
hit.is_backface = det > 0;
if (prim.flags & BVH_PRIMITIVE_FLAG_TRANSPARENT)
{
@@ -159,6 +162,7 @@ inline bool IntersectTriangleANY(
hit.distance = t;
hit.primitiveID = prim.primitiveID();
hit.bary = float2(u, v);
hit.is_backface = det > 0;
Surface surface;
surface.init();
@@ -107,6 +107,11 @@ void main(uint3 DTid : SV_DispatchThreadID)
ray.Origin = ray.Origin + ray.Direction * hit.distance;
hit_depth = hit.distance;
if (hit.is_backface)
{
surface.flags |= SURFACE_FLAG_BACKFACE;
}
if (!surface.load(hit.primitiveID, hit.bary))
return;
+1 -1
View File
@@ -9,7 +9,7 @@ namespace wi::version
// minor features, major updates, breaking compatibility changes
const int minor = 60;
// minor bug fixes, alterations, refactors, updates
const int revision = 21;
const int revision = 22;
const std::string version_string = std::to_string(major) + "." + std::to_string(minor) + "." + std::to_string(revision);