From 0653874165728b28a0791f94cb2fa22086a63ce7 Mon Sep 17 00:00:00 2001 From: hal8174 Date: Thu, 2 May 2024 11:09:34 +0200 Subject: [PATCH] Add new Assignment version. --- Assignments/Assignment1/Application1.cpp | 90 ++++++++++++++---------- Assignments/Assignment1/Application1.h | 3 +- Assignments/Assignment1/helper.hpp | 1 - 3 files changed, 55 insertions(+), 39 deletions(-) diff --git a/Assignments/Assignment1/Application1.cpp b/Assignments/Assignment1/Application1.cpp index 29b4aba..cda3722 100644 --- a/Assignments/Assignment1/Application1.cpp +++ b/Assignments/Assignment1/Application1.cpp @@ -5,7 +5,7 @@ void Application1::initScene() { /* select scene here */ standardScene(); - // standardScenewithAreaLight(); + // veachScene(); } void Application1::standardScene() { @@ -16,8 +16,11 @@ void Application1::standardScene() { camera.to = Vec3fa(278, 273, 0); Ref sceneGraph = loadOBJ(file, false).cast(); - sceneGraph->add(new SceneGraph::LightNodeImpl( - SceneGraph::PointLight(Vec3fa(213, 300, 227), Vec3fa(100000, 100000, 100000)))); + + auto light = new SceneGraph::QuadLightMesh(Vec3fa(343.0, 548.0, 227.0), Vec3fa(213.0, 548.0, 332.0), + Vec3fa(343.0, 548.0, 332.0), + Vec3fa(213.0, 548.0, 227.0), Vec3fa(100, 100, 100)); + sceneGraph->add(light); Ref flattened_scene = SceneGraph::flatten(sceneGraph, SceneGraph::INSTANCING_NONE); Scene* scene = new Scene; @@ -31,17 +34,21 @@ void Application1::standardScene() { scene = nullptr; } -void Application1::standardScenewithAreaLight() { - FileName file = workingDir + FileName("Framework/scenes/cornell_box.obj"); +void Application1::veachScene() { + FileName file = workingDir + FileName("Framework/scenes/veach.obj"); /* set default camera */ - camera.from = Vec3fa(278, 273, -800); - camera.to = Vec3fa(278, 273, 0); + camera.from = Vec3fa(1050, 185, 275); + camera.to = Vec3fa(255, 273, 271); + camera.fov = 60; Ref sceneGraph = loadOBJ(file, false).cast(); - sceneGraph->add(new SceneGraph::LightNodeImpl( - SceneGraph::QuadLight(Vec3fa(343.0, 548.0, 227.0), Vec3fa(343.0, 548.0, 332.0), Vec3fa(213.0, 548.0, 332.0), - Vec3fa(213.0, 548.0, 227.0), Vec3fa(100000, 100000, 100000)))); + + auto light = new SceneGraph::QuadLightMesh(Vec3fa(549.6, 0.0, 559.2), Vec3fa(0.0, 548.8, 559.2), + Vec3fa(0.0, 0.0, 559.2), Vec3fa(556.0, 548.8, 559.2), + Vec3fa(10, 10, 10)); + sceneGraph->add(light); + Ref flattened_scene = SceneGraph::flatten(sceneGraph, SceneGraph::INSTANCING_NONE); Scene* scene = new Scene; @@ -81,39 +88,50 @@ Vec3fa Application1::renderPixel(float x, float y, const ISPCCamera& camera, Ray sample.P = ray.org + ray.tfar * ray.dir; sample.Ng = ray.Ng; sample.Ns = Ns; - int matId = data.scene->geometries[ray.geomID]->materialID; - sample.Ng = face_forward(ray.dir, normalize(sample.Ng)); - sample.Ns = face_forward(ray.dir, normalize(sample.Ns)); + unsigned matId = data.scene->geometries[ray.geomID]->materialID; + unsigned lightID = data.scene->geometries[ray.geomID]->lightID; - /* calculate BRDF */ - BRDF brdf; - std::vector material_array = data.scene->materials; - Material__preprocess(material_array, matId, brdf, wo, sample); + if (lightID != unsigned(-1)) { + const Light* l = data.scene->lights[lightID]; + Light_EvalRes evalRes = Lights_eval(l, sample, -wo); - /* sample BRDF at hit point */ - Sample3f wi1; - Material__sample(material_array, matId, brdf, Lw, wo, sample, wi1, RandomSampler_get2D(sampler)); + L += evalRes.value; + } else { + sample.Ng = face_forward(ray.dir, normalize(sample.Ng)); + sample.Ns = face_forward(ray.dir, normalize(sample.Ns)); - const Light* l = data.scene->lights[0]; - Light_SampleRes ls = Lights_sample(l, sample, RandomSampler_get2D(sampler)); - Vec3f lightColor = {colorLight[0], colorLight[1], colorLight[2]}; + /* calculate BRDF */ + BRDF brdf; + std::vector material_array = data.scene->materials; + Material__preprocess(material_array, matId, brdf, wo, sample); - Vec3fa diffuse = Material__eval(material_array, matId, brdf, wo, sample, ls.dir); - L += diffuse; + /* sample BRDF at hit point */ + Sample3f wi1; + Material__sample(material_array, matId, brdf, Lw, wo, sample, wi1, RandomSampler_get2D(sampler)); - /* initialize shadow ray */ - Ray shadow(sample.P, ls.dir, 0.001f, ls.dist, 0.0f); + int id = (int)(RandomSampler_get1D(sampler) * data.scene->lights.size()); + if (id == data.scene->lights.size()) + id = data.scene->lights.size() - 1; + const Light* l = data.scene->lights[id]; - /* trace shadow ray */ - RTCOccludedArguments sargs; - rtcInitOccludedArguments(&sargs); - sargs.feature_mask = RTC_FEATURE_FLAG_TRIANGLE; - rtcOccluded1(data.g_scene, RTCRay_(shadow), &sargs); - RayStats_addShadowRay(stats); + Light_SampleRes ls = Lights_sample(l, sample, RandomSampler_get2D(sampler)); - /* add light contribution if not occluded */ - if (shadow.tfar >= 0.0f) { - L += ls.weight * lightColor * 0.1f; + Vec3fa diffuse = Material__eval(material_array, matId, brdf, wo, sample, ls.dir); + + /* initialize shadow ray */ + Ray shadow(sample.P, ls.dir, 0.001f, ls.dist, 0.0f); + + /* trace shadow ray */ + RTCOccludedArguments sargs; + rtcInitOccludedArguments(&sargs); + sargs.feature_mask = RTC_FEATURE_FLAG_TRIANGLE; + rtcOccluded1(data.g_scene, RTCRay_(shadow), &sargs); + RayStats_addShadowRay(stats); + + /* add light contribution if not occluded */ + if (shadow.tfar >= 0.0f) { + L += diffuse * ls.weight; + } } } diff --git a/Assignments/Assignment1/Application1.h b/Assignments/Assignment1/Application1.h index 879b590..32e8ec3 100644 --- a/Assignments/Assignment1/Application1.h +++ b/Assignments/Assignment1/Application1.h @@ -11,14 +11,13 @@ private: Vec3fa renderPixel(float x, float y, const ISPCCamera& camera, RayStats& stats, RandomSampler& sampler) override; void drawGUI() override { - ImGui::ColorEdit3("Color", colorLight); } void initScene() override; void standardScene(); - void standardScenewithAreaLight(); + void veachScene(); float colorLight[3] = {1.0f, 1.0f, 1.0f}; }; diff --git a/Assignments/Assignment1/helper.hpp b/Assignments/Assignment1/helper.hpp index c534cd9..75da19b 100644 --- a/Assignments/Assignment1/helper.hpp +++ b/Assignments/Assignment1/helper.hpp @@ -2,7 +2,6 @@ #include #include #include -#include #include #include