From c050caa789f1c8f040ea4273495b3338460fed55 Mon Sep 17 00:00:00 2001 From: RedShip Date: Thu, 23 Jan 2025 19:44:55 +0100 Subject: [PATCH] + | Some opti --- includes/RT/Scene.hpp | 3 +- includes/RT/objects/Triangle.hpp | 12 ++-- scenes/obj/Lowpoly_tree_sample.obj | 2 +- scenes/test.rt | 111 +---------------------------- shaders/compute.glsl | 1 + shaders/debug.glsl | 2 +- shaders/intersect.glsl | 41 +++++------ shaders/scatter.glsl | 20 ------ shaders/trace.glsl | 35 +-------- srcs/class/BVH.cpp | 2 +- srcs/class/Scene.cpp | 3 +- srcs/class/Shader.cpp | 4 +- 12 files changed, 39 insertions(+), 197 deletions(-) diff --git a/includes/RT/Scene.hpp b/includes/RT/Scene.hpp index a8490dd..110239f 100644 --- a/includes/RT/Scene.hpp +++ b/includes/RT/Scene.hpp @@ -6,7 +6,7 @@ /* By: ycontre +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/12/23 18:30:18 by ycontre #+# #+# */ -/* Updated: 2025/01/19 18:46:38 by ycontre ### ########.fr */ +/* Updated: 2025/01/23 18:30:18 by ycontre ### ########.fr */ /* */ /* ************************************************************************** */ @@ -89,6 +89,7 @@ struct GPUBvh struct GPUBvhData { glm::mat4 transform; + glm::mat4 inv_transform; alignas(16) glm::vec3 offset; float scale; diff --git a/includes/RT/objects/Triangle.hpp b/includes/RT/objects/Triangle.hpp index 95f5b20..2de29d0 100644 --- a/includes/RT/objects/Triangle.hpp +++ b/includes/RT/objects/Triangle.hpp @@ -6,7 +6,7 @@ /* By: ycontre +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/12/23 19:12:51 by ycontre #+# #+# */ -/* Updated: 2025/01/17 18:17:30 by ycontre ### ########.fr */ +/* Updated: 2025/01/23 19:39:33 by ycontre ### ########.fr */ /* */ /* ************************************************************************** */ @@ -42,21 +42,23 @@ class Triangle : public Object _vertex2 = glm::vec3(x2, y2, z2); _vertex3 = glm::vec3(x3, y3, z3); - // _vertex2 -= _position; //optimization - // _vertex3 -= _position; //optimization _normal = glm::normalize(glm::cross(_vertex2 - _position, _vertex3 - _position)); //optimization _centroid = (_position + _vertex2 + _vertex3) / 3.0f; + + // _vertex2 -= _position; //optimization + // _vertex3 -= _position; //optimization _mat_index = mat_index; } Triangle(const glm::vec3& position, const glm::vec3& vertex2, const glm::vec3& vertex3, const int mat_index) : Object(position, mat_index), _vertex2(vertex2), _vertex3(vertex3) { - // _vertex2 -= _position; //optimization - // _vertex3 -= _position; //optimization _normal = glm::normalize(glm::cross(_vertex2 - _position, _vertex3 - _position)); //optimization _centroid = (_position + _vertex2 + _vertex3) / 3.0f; + + // _vertex2 -= _position; //optimization + // _vertex3 -= _position; //optimization } const glm::vec3 &getVertex2() const { return (_vertex2); } diff --git a/scenes/obj/Lowpoly_tree_sample.obj b/scenes/obj/Lowpoly_tree_sample.obj index f199bf5..b8ac376 100644 --- a/scenes/obj/Lowpoly_tree_sample.obj +++ b/scenes/obj/Lowpoly_tree_sample.obj @@ -987,7 +987,7 @@ vt 0.65883 0.412179 vt 0.544646 0.412179 vt 0.715921 0.408093 vt 0.487555 0.408093 -mtllib obj/Lowpoly_tree_sample.mtl +mtllib Lowpoly_tree_sample.mtl usemtl Bark g Default f 7 8 14 13 diff --git a/scenes/test.rt b/scenes/test.rt index 62a746e..36bb8da 100644 --- a/scenes/test.rt +++ b/scenes/test.rt @@ -25,113 +25,4 @@ qu 11.5 0 -2.5 0 5 0 0 0 15 1 qu -2.5 0 11.5 0 5 0 15 0 0 4 - -OBJ obj/Dragon_8K.obj 0 0.38 0 1 -OBJ obj/Dragon_8K.obj 0 0.38 1 1 -OBJ obj/Dragon_8K.obj 0 0.38 2 1 -OBJ obj/Dragon_8K.obj 0 0.38 3 1 -OBJ obj/Dragon_8K.obj 0 0.38 4 1 -OBJ obj/Dragon_8K.obj 0 0.38 5 1 -OBJ obj/Dragon_8K.obj 0 0.38 6 1 -OBJ obj/Dragon_8K.obj 0 0.38 7 1 -OBJ obj/Dragon_8K.obj 0 0.38 8 1 -OBJ obj/Dragon_8K.obj 0 0.38 9 1 - -OBJ obj/Dragon_8K.obj 1 0.38 0 1 -OBJ obj/Dragon_8K.obj 1 0.38 1 1 -OBJ obj/Dragon_8K.obj 1 0.38 2 1 -OBJ obj/Dragon_8K.obj 1 0.38 3 1 -OBJ obj/Dragon_8K.obj 1 0.38 4 1 -OBJ obj/Dragon_8K.obj 1 0.38 5 1 -OBJ obj/Dragon_8K.obj 1 0.38 6 1 -OBJ obj/Dragon_8K.obj 1 0.38 7 1 -OBJ obj/Dragon_8K.obj 1 0.38 8 1 -OBJ obj/Dragon_8K.obj 1 0.38 9 1 - -OBJ obj/Dragon_8K.obj 2 0.38 0 1 -OBJ obj/Dragon_8K.obj 2 0.38 1 1 -OBJ obj/Dragon_8K.obj 2 0.38 2 1 -OBJ obj/Dragon_8K.obj 2 0.38 3 1 -OBJ obj/Dragon_8K.obj 2 0.38 4 1 -OBJ obj/Dragon_8K.obj 2 0.38 5 1 -OBJ obj/Dragon_8K.obj 2 0.38 6 1 -OBJ obj/Dragon_8K.obj 2 0.38 7 1 -OBJ obj/Dragon_8K.obj 2 0.38 8 1 -OBJ obj/Dragon_8K.obj 2 0.38 9 1 - -OBJ obj/Dragon_8K.obj 3 0.38 0 1 -OBJ obj/Dragon_8K.obj 3 0.38 1 1 -OBJ obj/Dragon_8K.obj 3 0.38 2 1 -OBJ obj/Dragon_8K.obj 3 0.38 3 1 -OBJ obj/Dragon_8K.obj 3 0.38 4 1 -OBJ obj/Dragon_8K.obj 3 0.38 5 1 -OBJ obj/Dragon_8K.obj 3 0.38 6 1 -OBJ obj/Dragon_8K.obj 3 0.38 7 1 -OBJ obj/Dragon_8K.obj 3 0.38 8 1 -OBJ obj/Dragon_8K.obj 3 0.38 9 1 - -OBJ obj/Dragon_8K.obj 4 0.38 0 1 -OBJ obj/Dragon_8K.obj 4 0.38 1 1 -OBJ obj/Dragon_8K.obj 4 0.38 2 1 -OBJ obj/Dragon_8K.obj 4 0.38 3 1 -OBJ obj/Dragon_8K.obj 4 0.38 4 1 -OBJ obj/Dragon_8K.obj 4 0.38 5 1 -OBJ obj/Dragon_8K.obj 4 0.38 6 1 -OBJ obj/Dragon_8K.obj 4 0.38 7 1 -OBJ obj/Dragon_8K.obj 4 0.38 8 1 -OBJ obj/Dragon_8K.obj 4 0.38 9 1 - -OBJ obj/Dragon_8K.obj 5 0.38 0 1 -OBJ obj/Dragon_8K.obj 5 0.38 1 1 -OBJ obj/Dragon_8K.obj 5 0.38 2 1 -OBJ obj/Dragon_8K.obj 5 0.38 3 1 -OBJ obj/Dragon_8K.obj 5 0.38 4 1 -OBJ obj/Dragon_8K.obj 5 0.38 5 1 -OBJ obj/Dragon_8K.obj 5 0.38 6 1 -OBJ obj/Dragon_8K.obj 5 0.38 7 1 -OBJ obj/Dragon_8K.obj 5 0.38 8 1 -OBJ obj/Dragon_8K.obj 5 0.38 9 1 - -OBJ obj/Dragon_8K.obj 6 0.38 0 1 -OBJ obj/Dragon_8K.obj 6 0.38 1 1 -OBJ obj/Dragon_8K.obj 6 0.38 2 1 -OBJ obj/Dragon_8K.obj 6 0.38 3 1 -OBJ obj/Dragon_8K.obj 6 0.38 4 1 -OBJ obj/Dragon_8K.obj 6 0.38 5 1 -OBJ obj/Dragon_8K.obj 6 0.38 6 1 -OBJ obj/Dragon_8K.obj 6 0.38 7 1 -OBJ obj/Dragon_8K.obj 6 0.38 8 1 -OBJ obj/Dragon_8K.obj 6 0.38 9 1 - -OBJ obj/Dragon_8K.obj 7 0.38 0 1 -OBJ obj/Dragon_8K.obj 7 0.38 1 1 -OBJ obj/Dragon_8K.obj 7 0.38 2 1 -OBJ obj/Dragon_8K.obj 7 0.38 3 1 -OBJ obj/Dragon_8K.obj 7 0.38 4 1 -OBJ obj/Dragon_8K.obj 7 0.38 5 1 -OBJ obj/Dragon_8K.obj 7 0.38 6 1 -OBJ obj/Dragon_8K.obj 7 0.38 7 1 -OBJ obj/Dragon_8K.obj 7 0.38 8 1 -OBJ obj/Dragon_8K.obj 7 0.38 9 1 - -OBJ obj/Dragon_8K.obj 8 0.38 0 1 -OBJ obj/Dragon_8K.obj 8 0.38 1 1 -OBJ obj/Dragon_8K.obj 8 0.38 2 1 -OBJ obj/Dragon_8K.obj 8 0.38 3 1 -OBJ obj/Dragon_8K.obj 8 0.38 4 1 -OBJ obj/Dragon_8K.obj 8 0.38 5 1 -OBJ obj/Dragon_8K.obj 8 0.38 6 1 -OBJ obj/Dragon_8K.obj 8 0.38 7 1 -OBJ obj/Dragon_8K.obj 8 0.38 8 1 -OBJ obj/Dragon_8K.obj 8 0.38 9 1 - -OBJ obj/Dragon_8K.obj 9 0.38 0 1 -OBJ obj/Dragon_8K.obj 9 0.38 1 1 -OBJ obj/Dragon_8K.obj 9 0.38 2 1 -OBJ obj/Dragon_8K.obj 9 0.38 3 1 -OBJ obj/Dragon_8K.obj 9 0.38 4 1 -OBJ obj/Dragon_8K.obj 9 0.38 5 1 -OBJ obj/Dragon_8K.obj 9 0.38 6 1 -OBJ obj/Dragon_8K.obj 9 0.38 7 1 -OBJ obj/Dragon_8K.obj 9 0.38 8 1 -OBJ obj/Dragon_8K.obj 9 0.38 9 1 +OBJ obj/Lowpoly_tree_sample.obj \ No newline at end of file diff --git a/shaders/compute.glsl b/shaders/compute.glsl index 4684f48..b7229d5 100644 --- a/shaders/compute.glsl +++ b/shaders/compute.glsl @@ -64,6 +64,7 @@ struct GPUVolume struct GPUBvhData { mat4 transform; + mat4 inv_transform; vec3 offset; float scale; diff --git a/shaders/debug.glsl b/shaders/debug.glsl index 3fa249c..8d558f5 100644 --- a/shaders/debug.glsl +++ b/shaders/debug.glsl @@ -262,7 +262,7 @@ hitInfo traverseBVHs(Ray ray, inout Stats stats) GPUBvhData bvh_data = BvhData[i]; mat3 transformMatrix = mat3(bvh_data.transform); - mat3 inverseTransformMatrix = inverse(transformMatrix); + mat3 inverseTransformMatrix = mat3(bvh_data.inv_transform); Ray transformedRay; transformedRay.direction = normalize(transformMatrix * ray.direction); diff --git a/shaders/intersect.glsl b/shaders/intersect.glsl index 255382a..de17b3d 100644 --- a/shaders/intersect.glsl +++ b/shaders/intersect.glsl @@ -93,31 +93,26 @@ bool intersectTriangle(Ray ray, GPUObject obj, out hitInfo hit) return (valid); } -bool intersectTriangle(Ray ray, GPUTriangle obj, out hitInfo hit) +bool intersectTriangle(Ray ray, GPUTriangle tri, out hitInfo hit) { - vec3 vertex1 = obj.vertex1 - obj.position; - vec3 vertex2 = obj.vertex2 - obj.position; + vec3 edgeAB = tri.vertex1 - tri.position; + vec3 edgeAC = tri.vertex2 - tri.position; + vec3 normalVector = tri.normal; + vec3 ao = ray.origin - tri.position; + vec3 dao = cross(ao, ray.direction); - vec3 pvec = cross(ray.direction, vertex2); - float det = dot(vertex1, pvec); - vec3 tvec = ray.origin - obj.position; - - float invDet = 1.0 / det; - float u = dot(tvec, pvec) * invDet; - vec3 qvec = cross(tvec, vertex1); - float v = dot(ray.direction, qvec) * invDet; - float t = dot(vertex2, qvec) * invDet; - - bool valid = abs(det) > 1e-8 && - u >= 0.0 && u <= 1.0 && - v >= 0.0 && (u + v) <= 1.0 && - t > 0.0; - - hit.t = t; - hit.position = ray.origin + ray.direction * t; - hit.normal = obj.normal * sign(-dot(ray.direction, obj.normal)); - - return (valid); + float determinant = -dot(ray.direction, normalVector); + float invDet = 1 / determinant; + + float dst = dot(ao, normalVector) * invDet; + float u = dot(edgeAC, dao) * invDet; + float v = -dot(edgeAB, dao) * invDet; + float w = 1 - u - v; + + hit.position = ray.origin + ray.direction * dst; + hit.normal = normalVector; + hit.t = dst; + return (determinant >= 1E-8 && dst >= 0 && u >= 0 && v >= 0 && w >= 0); } bool intersectCube(Ray ray, GPUObject obj, out hitInfo hit) diff --git a/shaders/scatter.glsl b/shaders/scatter.glsl index c17d60f..fd61ad2 100644 --- a/shaders/scatter.glsl +++ b/shaders/scatter.glsl @@ -79,26 +79,6 @@ Ray transparencyRay(hitInfo hit, Ray ray, GPUMaterial mat, inout uint rng_state) return newRay; } - -// Ray transparencyRay(hitInfo hit, Ray ray, GPUMaterial mat, inout uint rng_state) -// { -// vec3 specular_origin = hit.position + hit.normal * 0.001; -// vec3 specular_dir = mix(normalize(reflect(ray.direction, hit.normal)), lambertRay(hit, ray, mat, rng_state).direction, mat.roughness); - -// vec3 transparency_origin = ray.origin + ray.direction * hit.last_t + ray.direction * 0.001; -// vec3 transparency_dir = ray.direction; - -// Ray specular_ray = Ray(specular_origin, specular_dir); -// Ray transparency_ray = Ray(transparency_origin, transparency_dir); - -// bool is_transparent = (mat.metallic >= randomValue(rng_state)); - -// if (is_transparent) -// return (transparency_ray); -// return (specular_ray); -// } - - Ray newRay(hitInfo hit, Ray ray, inout uint rng_state) { GPUObject obj; diff --git a/shaders/trace.glsl b/shaders/trace.glsl index 9356c77..e7d4c9b 100644 --- a/shaders/trace.glsl +++ b/shaders/trace.glsl @@ -22,7 +22,7 @@ Ray portalRay(Ray ray, hitInfo hit) ray.origin = portal_2.position + rotation * relative; ray.direction = normalize(rotation * ray.direction); - ray.origin += ray.direction * 0.01f; + ray.origin += ray.direction * 0.01f; return (ray); } @@ -39,6 +39,7 @@ hitInfo traceScene(Ray ray) GPUObject obj = objects[i]; hitInfo temp_hit; + if (intersect(ray, obj, temp_hit) && temp_hit.t < hit.t) { hit.t = temp_hit.t; @@ -118,36 +119,6 @@ hitInfo traceBVH(Ray ray, GPUBvhData bvh_data) return (hit); } -// hitInfo traverseBVHs(Ray ray) -// { -// hitInfo hit; - -// hit.t = 1e30; -// hit.obj_index = -1; - -// for (int i = 0; i < u_bvhNum; i++) -// { -// GPUBvhData bvh_data = BvhData[i]; - -// ray.origin -= bvh_data.offset; -// hitInfo temp_hit = traceBVH(ray, bvh_data); - -// if (temp_hit.t < hit.t) -// { -// hit.t = temp_hit.t; -// hit.last_t = temp_hit.last_t; -// hit.obj_index = temp_hit.obj_index; -// hit.mat_index = temp_hit.mat_index; -// hit.position = temp_hit.position; -// hit.normal = temp_hit.normal; -// } - -// ray.origin += bvh_data.offset; -// } - -// return (hit); -// } - hitInfo traverseBVHs(Ray ray) { hitInfo hit; @@ -160,7 +131,7 @@ hitInfo traverseBVHs(Ray ray) GPUBvhData bvh_data = BvhData[i]; mat3 transformMatrix = mat3(bvh_data.transform); - mat3 inverseTransformMatrix = inverse(transformMatrix); + mat3 inverseTransformMatrix = mat3(bvh_data.inv_transform); Ray transformedRay; transformedRay.direction = normalize(transformMatrix * ray.direction); diff --git a/srcs/class/BVH.cpp b/srcs/class/BVH.cpp index 496dc40..4a1ef68 100644 --- a/srcs/class/BVH.cpp +++ b/srcs/class/BVH.cpp @@ -6,7 +6,7 @@ /* By: ycontre +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/01/16 21:48:48 by TheRed #+# #+# */ -/* Updated: 2025/01/19 18:30:27 by ycontre ### ########.fr */ +/* Updated: 2025/01/23 18:30:20 by ycontre ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/srcs/class/Scene.cpp b/srcs/class/Scene.cpp index f3aab2c..cfdaa93 100644 --- a/srcs/class/Scene.cpp +++ b/srcs/class/Scene.cpp @@ -6,7 +6,7 @@ /* By: ycontre +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/12/23 18:29:41 by ycontre #+# #+# */ -/* Updated: 2025/01/21 14:45:04 by tomoron ### ########.fr */ +/* Updated: 2025/01/23 18:31:52 by ycontre ### ########.fr */ /* */ /* ************************************************************************** */ @@ -155,6 +155,7 @@ void Scene::addBvh(std::vector &triangles, glm::vec3 offset, float sc new_bvhs_list = bvh->getGPUBvhs(); new_bvh_data.transform = transform * scale; + new_bvh_data.inv_transform = glm::inverse(new_bvh_data.transform); new_bvh_data.offset = offset; new_bvh_data.scale = scale; new_bvh_data.bvh_start_index = _gpu_bvh.size(); diff --git a/srcs/class/Shader.cpp b/srcs/class/Shader.cpp index a141739..f83185c 100644 --- a/srcs/class/Shader.cpp +++ b/srcs/class/Shader.cpp @@ -6,7 +6,7 @@ /* By: ycontre +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/10/13 20:21:13 by ycontre #+# #+# */ -/* Updated: 2025/01/19 18:58:42 by ycontre ### ########.fr */ +/* Updated: 2025/01/23 18:46:34 by ycontre ### ########.fr */ /* */ /* ************************************************************************** */ @@ -67,7 +67,7 @@ Shader::Shader(std::string vertexPath, std::string fragmentPath, std::string com const char *fragmentCode = loadFileWithIncludes(fragmentPath); const char *computeCode = loadFileWithIncludes(computePath); - printWithLineNumbers(computeCode); + // printWithLineNumbers(computeCode); _vertex = glCreateShader(GL_VERTEX_SHADER);