software raytrace: correctly handle backface lighting
This commit is contained in:
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user