mirror of
https://github.com/TheRedShip/RT_GPU.git
synced 2025-09-27 10:48:34 +02:00
~ | BVH Opti working
This commit is contained in:
@ -18,7 +18,7 @@ pl 0 0 -2 0 0 1 1 // back wall
|
|||||||
pl 0 0 2 0 0 -1 5 // front wall
|
pl 0 0 2 0 0 -1 5 // front wall
|
||||||
pl 2 0 0 -1 0 0 3 // right wall
|
pl 2 0 0 -1 0 0 3 // right wall
|
||||||
pl -2 0 0 1 0 0 2 // left wall
|
pl -2 0 0 1 0 0 2 // left wall
|
||||||
pl 0 2 0 0 -1 0 0 // ceiling
|
# pl 0 2 0 0 -1 0 0 // ceiling
|
||||||
pl 0 -2 0 0 1 0 2 // floor
|
pl 0 -2 0 0 1 0 2 // floor
|
||||||
|
|
||||||
qu -1 1.999 -1 2 0 0 0 0 2 6
|
qu -1 1.999 -1 2 0 0 0 0 2 6
|
||||||
|
@ -150,56 +150,49 @@ hitInfo traceBVH(Ray ray, inout Stats stats)
|
|||||||
|
|
||||||
GPUBvh node = bvh[current_index];
|
GPUBvh node = bvh[current_index];
|
||||||
|
|
||||||
stats.box_count++;
|
if (node.is_leaf != 0)
|
||||||
if (intersectRayBVH(ray, node, hit_bvh) && hit_bvh.t < hit.t)
|
{
|
||||||
{
|
for (int i = 0; i < node.primitive_count; i++)
|
||||||
if (node.is_leaf != 0)
|
{
|
||||||
{
|
GPUTriangle obj = triangles[node.first_primitive + i];
|
||||||
for (int i = 0; i < node.primitive_count; i++)
|
|
||||||
{
|
hitInfo temp_hit;
|
||||||
GPUTriangle obj = triangles[node.first_primitive + i];
|
if (intersectTriangle(ray, obj, temp_hit) && temp_hit.t > 0.0f && temp_hit.t < hit.t + 0.0001)
|
||||||
|
{
|
||||||
hitInfo temp_hit;
|
hit.t = temp_hit.t;
|
||||||
if (intersectTriangle(ray, obj, temp_hit) && temp_hit.t > 0.0f && temp_hit.t < hit.t + 0.0001)
|
hit.normal = temp_hit.normal;
|
||||||
{
|
hit.obj_index = node.first_primitive + i;
|
||||||
hit.t = temp_hit.t;
|
}
|
||||||
hit.normal = temp_hit.normal;
|
stats.triangle_count++;
|
||||||
hit.obj_index = node.first_primitive + i;
|
}
|
||||||
}
|
}
|
||||||
stats.triangle_count++;
|
else
|
||||||
}
|
{
|
||||||
}
|
GPUBvh left_node = bvh[node.left_index];
|
||||||
|
GPUBvh right_node = bvh[node.right_index];
|
||||||
|
|
||||||
|
hitInfo left_hit;
|
||||||
|
hitInfo right_hit;
|
||||||
|
|
||||||
|
left_hit.t = 1e30;
|
||||||
|
right_hit.t = 1e30;
|
||||||
|
|
||||||
|
stats.box_count += 2;
|
||||||
|
|
||||||
|
bool left_bool = intersectRayBVH(ray, left_node, left_hit);
|
||||||
|
bool right_bool = intersectRayBVH(ray, right_node, right_hit);
|
||||||
|
|
||||||
|
if (left_hit.t > right_hit.t)
|
||||||
|
{
|
||||||
|
if (left_hit.t < hit.t && left_bool) stack[++stack_ptr] = node.left_index;
|
||||||
|
if (right_hit.t < hit.t && right_bool) stack[++stack_ptr] = node.right_index;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// GPUBvh left_node = bvh[node.left_index];
|
if (right_hit.t < hit.t && right_bool) stack[++stack_ptr] = node.right_index;
|
||||||
// GPUBvh right_node = bvh[node.right_index];
|
if (left_hit.t < hit.t && left_bool) stack[++stack_ptr] = node.left_index;
|
||||||
|
}
|
||||||
// hitInfo left_hit;
|
}
|
||||||
// hitInfo right_hit;
|
|
||||||
|
|
||||||
// left_hit.t = 1e30;
|
|
||||||
// right_hit.t = 1e30;
|
|
||||||
|
|
||||||
// stats.box_count += 2;
|
|
||||||
|
|
||||||
// intersectRayBVH(ray, left_node, left_hit);
|
|
||||||
// intersectRayBVH(ray, right_node, right_hit);
|
|
||||||
|
|
||||||
// if (left_hit.t > right_hit.t)
|
|
||||||
// {
|
|
||||||
// if (left_hit.t < hit.t) stack[++stack_ptr] = node.left_index;
|
|
||||||
// if (right_hit.t < hit.t) stack[++stack_ptr] = node.right_index;
|
|
||||||
// }
|
|
||||||
// else
|
|
||||||
// {
|
|
||||||
// if (right_hit.t < hit.t) stack[++stack_ptr] = node.right_index;
|
|
||||||
// if (left_hit.t < hit.t) stack[++stack_ptr] = node.left_index;
|
|
||||||
// }
|
|
||||||
|
|
||||||
stack[++stack_ptr] = node.left_index;
|
|
||||||
stack[++stack_ptr] = node.right_index;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return (hit);
|
return (hit);
|
||||||
|
14
srcs/RT.cpp
14
srcs/RT.cpp
@ -6,7 +6,7 @@
|
|||||||
/* By: ycontre <ycontre@student.42.fr> +#+ +:+ +#+ */
|
/* By: ycontre <ycontre@student.42.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2024/09/27 14:51:49 by TheRed #+# #+# */
|
/* Created: 2024/09/27 14:51:49 by TheRed #+# #+# */
|
||||||
/* Updated: 2025/01/17 19:25:14 by ycontre ### ########.fr */
|
/* Updated: 2025/01/18 19:21:00 by ycontre ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
@ -20,8 +20,8 @@ int main(int argc, char **argv)
|
|||||||
return (1);
|
return (1);
|
||||||
|
|
||||||
Window window(&scene, WIDTH, HEIGHT, "RT_GPU", 0);
|
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;
|
GLint max_gpu_size;
|
||||||
glGetIntegerv(GL_MAX_SHADER_STORAGE_BLOCK_SIZE, &max_gpu_size);
|
glGetIntegerv(GL_MAX_SHADER_STORAGE_BLOCK_SIZE, &max_gpu_size);
|
||||||
@ -128,8 +128,8 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
recorded_fps.push_back((int)window.getFps());
|
recorded_fps.push_back((int)window.getFps());
|
||||||
|
|
||||||
float y_offset = 30;
|
float y_offset = 0.;
|
||||||
float dist_to_obj = 60;
|
float dist_to_obj = 2;
|
||||||
float speed = 0.5;
|
float speed = 0.5;
|
||||||
|
|
||||||
camera->setPosition(glm::vec3(
|
camera->setPosition(glm::vec3(
|
||||||
@ -189,8 +189,8 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
// performance profiling
|
// performance profiling
|
||||||
std::ofstream file("fps.txt");
|
std::ofstream file("fps.txt");
|
||||||
for (int i = 0; i < recorded_fps.size(); i++)
|
for (int i = 0; i < (int) recorded_fps.size(); i++)
|
||||||
file << i << " " << recorded_fps[i] << std::endl;
|
file << recorded_fps[i] << std::endl;
|
||||||
file.close();
|
file.close();
|
||||||
//
|
//
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
/* By: ycontre <ycontre@student.42.fr> +#+ +:+ +#+ */
|
/* By: ycontre <ycontre@student.42.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2025/01/16 21:48:48 by TheRed #+# #+# */
|
/* Created: 2025/01/16 21:48:48 by TheRed #+# #+# */
|
||||||
/* Updated: 2025/01/17 19:25:08 by ycontre ### ########.fr */
|
/* Updated: 2025/01/18 19:16:45 by ycontre ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
/* By: ycontre <ycontre@student.42.fr> +#+ +:+ +#+ */
|
/* By: ycontre <ycontre@student.42.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2024/10/13 20:21:13 by ycontre #+# #+# */
|
/* Created: 2024/10/13 20:21:13 by ycontre #+# #+# */
|
||||||
/* Updated: 2025/01/17 19:05:41 by ycontre ### ########.fr */
|
/* Updated: 2025/01/18 19:08:58 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 *fragmentCode = loadFileWithIncludes(fragmentPath);
|
||||||
const char *computeCode = loadFileWithIncludes(computePath);
|
const char *computeCode = loadFileWithIncludes(computePath);
|
||||||
|
|
||||||
printWithLineNumbers(computeCode);
|
// printWithLineNumbers(computeCode);
|
||||||
|
|
||||||
_vertex = glCreateShader(GL_VERTEX_SHADER);
|
_vertex = glCreateShader(GL_VERTEX_SHADER);
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
/* By: ycontre <ycontre@student.42.fr> +#+ +:+ +#+ */
|
/* By: ycontre <ycontre@student.42.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2024/10/13 16:16:24 by TheRed #+# #+# */
|
/* Created: 2024/10/13 16:16:24 by TheRed #+# #+# */
|
||||||
/* Updated: 2025/01/15 19:34:25 by ycontre ### ########.fr */
|
/* Updated: 2025/01/18 18:40:41 by ycontre ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
@ -175,7 +175,7 @@ void Window::imGuiRender()
|
|||||||
|
|
||||||
ImGui::Text("Fps: %d", int(_fps));
|
ImGui::Text("Fps: %d", int(_fps));
|
||||||
ImGui::Text("Frame: %d", _frameCount);
|
ImGui::Text("Frame: %d", _frameCount);
|
||||||
ImGui::Text("Objects: %d", _scene->getObjectData().size() + _scene->getTriangleData().size());
|
ImGui::Text("Objects: %lu", _scene->getObjectData().size() + _scene->getTriangleData().size());
|
||||||
|
|
||||||
ImGui::Separator();
|
ImGui::Separator();
|
||||||
if (ImGui::Checkbox("Accumulate", &accumulate))
|
if (ImGui::Checkbox("Accumulate", &accumulate))
|
||||||
|
Reference in New Issue
Block a user