From 8466e672f67d572a54239da2ee8e9955864aae88 Mon Sep 17 00:00:00 2001 From: RedShip Date: Tue, 28 Jan 2025 19:19:46 +0100 Subject: [PATCH] + | texture --- includes/RT/ObjParser.hpp | 4 ++-- includes/RT/Scene.hpp | 2 +- includes/RT/objects/Triangle.hpp | 2 +- shaders/compute.glsl | 3 +++ shaders/intersect.glsl | 6 ++++-- shaders/light.glsl | 5 ++++- shaders/trace.glsl | 2 ++ srcs/RT.cpp | 6 +++--- srcs/class/ObjParser.cpp | 23 ++++++++++++++++++----- srcs/class/Scene.cpp | 7 +++++-- 10 files changed, 43 insertions(+), 17 deletions(-) diff --git a/includes/RT/ObjParser.hpp b/includes/RT/ObjParser.hpp index 0cef445..2338997 100644 --- a/includes/RT/ObjParser.hpp +++ b/includes/RT/ObjParser.hpp @@ -6,7 +6,7 @@ /* By: ycontre +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/01/16 15:00:49 by tomoron #+# #+# */ -/* Updated: 2025/01/24 18:49:57 by ycontre ### ########.fr */ +/* Updated: 2025/01/28 18:53:37 by ycontre ### ########.fr */ /* */ /* ************************************************************************** */ @@ -30,7 +30,7 @@ class ObjParser long int checkVertexIndex(int index, size_t size); void parseMtl(std::stringstream &line, Scene &scene); bool addTriangleFromPolygon(std::vector &vertices, int inv); - void addTriangle(glm::vec3 v1, glm::vec3 v2, glm::vec3 v3, glm::vec2 vt1, glm::vec2 vt2, glm::vec2 vt3); + void addTriangle(glm::vec3 v1, glm::vec3 v2, glm::vec3 v3, std::vector textureVertices); std::string getFilePath(std::string &file); int pointInTriangle(glm::vec3 pts[3], std::vector vertices, size_t cur); std::vector objSplit(std::string str, std::string delim); diff --git a/includes/RT/Scene.hpp b/includes/RT/Scene.hpp index 60e94f3..d2a3e9c 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/25 14:10:19 by tomoron ### ########.fr */ +/* Updated: 2025/01/28 19:05:16 by ycontre ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/includes/RT/objects/Triangle.hpp b/includes/RT/objects/Triangle.hpp index f3c5315..4c1a50e 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/23 19:39:33 by ycontre ### ########.fr */ +/* Updated: 2025/01/28 19:15:41 by ycontre ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/shaders/compute.glsl b/shaders/compute.glsl index 62d9804..f54f54c 100644 --- a/shaders/compute.glsl +++ b/shaders/compute.glsl @@ -153,6 +153,9 @@ struct hitInfo vec3 position; int obj_index; int mat_index; + + float u; + float v; }; #include "shaders/random.glsl" diff --git a/shaders/intersect.glsl b/shaders/intersect.glsl index 3bdec19..207fdac 100644 --- a/shaders/intersect.glsl +++ b/shaders/intersect.glsl @@ -87,10 +87,12 @@ bool intersectTriangle(Ray ray, GPUTriangle obj, out hitInfo hit) v >= 0.0 && (u + v) <= 1.0 && t > 0.0; + hit.u = u; + hit.v = v; hit.t = t; hit.position = ray.origin + ray.direction * t; - hit.normal = vec3(u, v, 1 - (u + v)); //texture mapping - // hit.normal = obj.normal * sign(-dot(ray.direction, obj.normal)); + // hit.normal = vec3(u, v, 1 - (u + v)); //texture mapping + hit.normal = obj.normal * sign(-dot(ray.direction, obj.normal)); return (valid); } diff --git a/shaders/light.glsl b/shaders/light.glsl index 164328f..52ce1ec 100644 --- a/shaders/light.glsl +++ b/shaders/light.glsl @@ -105,12 +105,15 @@ uniform sampler2D textures[16]; vec3 getTextureColor(int texture_index, hitInfo hit) { - vec2 uv = getSphereUV(hit.normal); + GPUTriangle tri = triangles[hit.obj_index]; + vec2 uv = hit.u * tri.texture_vertex2 + hit.v * tri.texture_vertex3 + (1 - (hit.u + hit.v)) * tri.texture_vertex1; + return vec3(uv, 0.); return (texture(textures[texture_index], uv).rgb); } void calculateLightColor(GPUMaterial mat, hitInfo hit, inout vec3 color, inout vec3 light, inout uint rng_state) { + color *= mat.texture_index; if (mat.texture_index != -1) color *= getTextureColor(mat.texture_index, hit); diff --git a/shaders/trace.glsl b/shaders/trace.glsl index a8bfa15..0c6876d 100644 --- a/shaders/trace.glsl +++ b/shaders/trace.glsl @@ -80,6 +80,8 @@ hitInfo traceBVH(Ray ray, GPUBvhData bvh_data) hitInfo temp_hit; if (intersectTriangle(ray, obj, temp_hit) && temp_hit.t < hit.t) { + hit.u = temp_hit.u; + hit.v = temp_hit.v; hit.t = temp_hit.t; hit.last_t = temp_hit.last_t; hit.obj_index = bvh_data.triangle_start_index + node.index + i; diff --git a/srcs/RT.cpp b/srcs/RT.cpp index 82b459f..a7df156 100644 --- a/srcs/RT.cpp +++ b/srcs/RT.cpp @@ -6,7 +6,7 @@ /* By: ycontre +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/09/27 14:51:49 by TheRed #+# #+# */ -/* Updated: 2025/01/28 18:34:10 by ycontre ### ########.fr */ +/* Updated: 2025/01/28 19:01:09 by ycontre ### ########.fr */ /* */ /* ************************************************************************** */ @@ -20,9 +20,9 @@ int main(int argc, char **argv) return (1); Window window(&scene, WIDTH, HEIGHT, "RT_GPU", 0); - // Shader shader("shaders/vertex.vert", "shaders/frag.frag", "shaders/compute.glsl"); + Shader shader("shaders/vertex.vert", "shaders/frag.frag", "shaders/compute.glsl"); - Shader shader("shaders/vertex.vert", "shaders/frag.frag", "shaders/debug.glsl"); + // Shader shader("shaders/vertex.vert", "shaders/frag.frag", "shaders/debug.glsl"); GLint max_gpu_size; glGetIntegerv(GL_MAX_SHADER_STORAGE_BLOCK_SIZE, &max_gpu_size); diff --git a/srcs/class/ObjParser.cpp b/srcs/class/ObjParser.cpp index e57c106..4697074 100644 --- a/srcs/class/ObjParser.cpp +++ b/srcs/class/ObjParser.cpp @@ -6,7 +6,7 @@ /* By: ycontre +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/01/16 15:00:33 by tomoron #+# #+# */ -/* Updated: 2025/01/28 18:30:33 by ycontre ### ########.fr */ +/* Updated: 2025/01/28 19:18:37 by ycontre ### ########.fr */ /* */ /* ************************************************************************** */ @@ -122,7 +122,7 @@ bool ObjParser::addTriangleFromPolygon(std::vector &vertices, int inv if(pointInTriangle(triangleVertices, vertices, i)) continue; vertices.erase(vertices.begin() + i); - addTriangle(v1, v2, v3, glm::vec2(0.), glm::vec2(0.), glm::vec2(0.)); + addTriangle(v1, v2, v3, std::vector(0)); return(1); } return(0); @@ -153,7 +153,9 @@ void ObjParser::getFaceVertices(std::vector &faceVertices, std::vecto std::runtime_error("OBJ : too many values in an element of a face"); if(sp.size() == 0) std::runtime_error("OBJ : wtf ?"); - textureVertices.push_back(_textureVertices[checkVertexIndex(std::stoi(sp[1]), _textureVertices.size())]); + + if (sp.size() > 1 && sp[1].length()) + textureVertices.push_back(_textureVertices[checkVertexIndex(std::stoi(sp[1]), _textureVertices.size())]); faceVertices.push_back(_vertices[checkVertexIndex(std::stoi(sp[0]), _vertices.size())]); } } @@ -176,11 +178,22 @@ void ObjParser::addFace(std::stringstream &line) if(!line.eof()) throw std::runtime_error("OBJ: an error occured while parsing face"); - addTriangle(faceVertices[0], faceVertices[1], faceVertices[2], textureVertices[0], textureVertices[1], textureVertices[2]); + addTriangle(faceVertices[0], faceVertices[1], faceVertices[2], textureVertices); } -void ObjParser::addTriangle(glm::vec3 v1, glm::vec3 v2, glm::vec3 v3, glm::vec2 vt1, glm::vec2 vt2, glm::vec2 vt3) +void ObjParser::addTriangle(glm::vec3 v1, glm::vec3 v2, glm::vec3 v3, std::vector texture_vertices) { + glm::vec2 vt1 = glm::vec2(0.); + glm::vec2 vt2 = glm::vec2(0.); + glm::vec2 vt3 = glm::vec2(0.); + + if (texture_vertices.size() == 3) + { + vt1 = texture_vertices[0]; + vt2 = texture_vertices[1]; + vt3 = texture_vertices[2]; + } + _triangles.push_back(Triangle(v1, v2, v3, vt1, vt2, vt3, _mat)); } diff --git a/srcs/class/Scene.cpp b/srcs/class/Scene.cpp index c76945d..a9a623a 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/27 18:55:18 by ycontre ### ########.fr */ +/* Updated: 2025/01/28 19:17:39 by ycontre ### ########.fr */ /* */ /* ************************************************************************** */ @@ -116,6 +116,10 @@ void Scene::addObject(Object *obj) gpu_triangle.vertex2 = triangle->getVertex3(); gpu_triangle.normal = triangle->getNormal(); + gpu_triangle.texture_vertex1 = triangle->getTextureVertex1(); + gpu_triangle.texture_vertex2 = triangle->getTextureVertex1(); + gpu_triangle.texture_vertex3 = triangle->getTextureVertex1(); + _gpu_triangles.push_back(gpu_triangle); gpu_obj.vertex1 = triangle->getVertex2(); @@ -185,7 +189,6 @@ void Scene::addBvh(std::vector &triangles, glm::vec3 offset, float sc gpu_triangle.texture_vertex2 = triangles[i].getTextureVertex2(); gpu_triangle.texture_vertex3 = triangles[i].getTextureVertex3(); - _gpu_triangles.push_back(gpu_triangle); }