bool rayTriangle(Ray ray, vec3 v0, vec3 v1, vec3 v2, out float t, out float u, out float v) { vec3 edge1 = v1 - v0; vec3 edge2 = v2 - v0; vec3 h = cross(ray.direction, edge2); float det = dot(edge1, h); // det ≈ 0 means ray is parallel to triangle if (abs(det) < 1e-8) return false; float invDet = 1.0 / det; vec3 s = ray.origin - v0; u = dot(s, h) * invDet; if (u < 0.0 || u > 1.0) return false; vec3 q = cross(s, edge1); v = dot(ray.direction, q) * invDet; if (v < 0.0 || u + v > 1.0) return false; t = dot(edge2, q) * invDet; return t > 1e-4; // t_min to avoid self-intersection}
Back-Face Culling
det < 0 means ray hits the back face of the triangle
For opaque geometry: if (det < 1e-8) return false; (cull back faces)
For double-sided materials: use abs(det)
In Vulkan: VK_GEOMETRY_INSTANCE_TRIANGLE_FACING_CULL_DISABLE_BIT_KHR disables culling