From a2e89438ba45a600c186f4573aec35ddb783c576 Mon Sep 17 00:00:00 2001 From: Alex <42661490+ThatRedox@users.noreply.github.com> Date: Tue, 27 Dec 2022 11:40:50 -0800 Subject: [PATCH] Carry energy through specular reflection, metallic reflection, and transmission. (#1514) * Carry energy through specular and metallic reflection and transmission. * Fix copy/paste typo. --- .../chunky/renderer/scene/PathTracer.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/chunky/src/java/se/llbit/chunky/renderer/scene/PathTracer.java b/chunky/src/java/se/llbit/chunky/renderer/scene/PathTracer.java index b89c765164..4099a0e1b5 100644 --- a/chunky/src/java/se/llbit/chunky/renderer/scene/PathTracer.java +++ b/chunky/src/java/se/llbit/chunky/renderer/scene/PathTracer.java @@ -138,6 +138,10 @@ public static boolean pathTrace(Scene scene, Ray ray, WorkerState state, int add reflected.specularReflection(ray, random); if (pathTrace(scene, reflected, state, 1, false)) { + ray.emittance.x = ray.color.x * reflected.emittance.x; + ray.emittance.y = ray.color.y * reflected.emittance.y; + ray.emittance.z = ray.color.z * reflected.emittance.z; + if (doMetal) { // use the albedo color as specular color ray.color.x *= reflected.color.x; @@ -299,6 +303,10 @@ public static boolean pathTrace(Scene scene, Ray ray, WorkerState state, int add Ray reflected = new Ray(); reflected.specularReflection(ray, random); if (pathTrace(scene, reflected, state, 1, false)) { + ray.emittance.x = ray.color.x * reflected.emittance.x; + ray.emittance.y = ray.color.y * reflected.emittance.y; + ray.emittance.z = ray.color.z * reflected.emittance.z; + ray.color.x = reflected.color.x; ray.color.y = reflected.color.y; ray.color.z = reflected.color.z; @@ -337,6 +345,11 @@ public static boolean pathTrace(Scene scene, Ray ray, WorkerState state, int add ray.color.x = ray.color.x * pDiffuse + (1 - pDiffuse); ray.color.y = ray.color.y * pDiffuse + (1 - pDiffuse); ray.color.z = ray.color.z * pDiffuse + (1 - pDiffuse); + + ray.emittance.x = ray.color.x * refracted.emittance.x; + ray.emittance.y = ray.color.y * refracted.emittance.y; + ray.emittance.z = ray.color.z * refracted.emittance.z; + ray.color.x *= refracted.color.x; ray.color.y *= refracted.color.y; ray.color.z *= refracted.color.z; @@ -356,6 +369,11 @@ public static boolean pathTrace(Scene scene, Ray ray, WorkerState state, int add ray.color.x = ray.color.x * pDiffuse + (1 - pDiffuse); ray.color.y = ray.color.y * pDiffuse + (1 - pDiffuse); ray.color.z = ray.color.z * pDiffuse + (1 - pDiffuse); + + ray.emittance.x = ray.color.x * transmitted.emittance.x; + ray.emittance.y = ray.color.y * transmitted.emittance.y; + ray.emittance.z = ray.color.z * transmitted.emittance.z; + ray.color.x *= transmitted.color.x; ray.color.y *= transmitted.color.y; ray.color.z *= transmitted.color.z;