mirror of
https://github.com/TheRedShip/RT_GPU.git
synced 2025-09-27 10:48:34 +02:00
+ | Handling transformation objects
This commit is contained in:
3
.vscode/settings.json
vendored
3
.vscode/settings.json
vendored
@ -79,7 +79,8 @@
|
|||||||
"xlocmes": "cpp",
|
"xlocmes": "cpp",
|
||||||
"xlocmon": "cpp",
|
"xlocmon": "cpp",
|
||||||
"xloctime": "cpp",
|
"xloctime": "cpp",
|
||||||
"xtree": "cpp"
|
"xtree": "cpp",
|
||||||
|
"forward_list": "cpp"
|
||||||
},
|
},
|
||||||
"cmake.ignoreCMakeListsMissing": true
|
"cmake.ignoreCMakeListsMissing": true
|
||||||
}
|
}
|
2
Makefile
2
Makefile
@ -11,7 +11,7 @@ ifeq ($(OS),Windows_NT)
|
|||||||
LINE_CLR = \33[2K\r
|
LINE_CLR = \33[2K\r
|
||||||
RM := del /S /Q
|
RM := del /S /Q
|
||||||
DIR_DUP = if not exist "$(@D)" mkdir "$(@D)"
|
DIR_DUP = if not exist "$(@D)" mkdir "$(@D)"
|
||||||
CC := g++
|
CC := g++ -O3
|
||||||
IFLAGS := -I./includes -I./includes/RT -I./includes/imgui
|
IFLAGS := -I./includes -I./includes/RT -I./includes/imgui
|
||||||
LDFLAGS := -L./lib -lglfw3 -lopengl32 -lgdi32 -lcglm
|
LDFLAGS := -L./lib -lglfw3 -lopengl32 -lgdi32 -lcglm
|
||||||
else
|
else
|
||||||
|
10
imgui.ini
10
imgui.ini
@ -5,20 +5,24 @@ Size=400,400
|
|||||||
[Window][Camera]
|
[Window][Camera]
|
||||||
Pos=1643,7
|
Pos=1643,7
|
||||||
Size=259,200
|
Size=259,200
|
||||||
|
Collapsed=1
|
||||||
|
|
||||||
[Window][Material]
|
[Window][Material]
|
||||||
Pos=1646,209
|
Pos=1642,29
|
||||||
Size=266,299
|
Size=266,299
|
||||||
|
Collapsed=1
|
||||||
|
|
||||||
[Window][Fog settings]
|
[Window][Fog settings]
|
||||||
Pos=1649,509
|
Pos=1641,52
|
||||||
Size=247,130
|
Size=247,130
|
||||||
|
Collapsed=1
|
||||||
|
|
||||||
[Window][Debug]
|
[Window][Debug]
|
||||||
Pos=1642,668
|
Pos=1642,668
|
||||||
Size=260,143
|
Size=260,143
|
||||||
|
|
||||||
[Window][Debug BVH]
|
[Window][Debug BVH]
|
||||||
Pos=1646,642
|
Pos=1641,72
|
||||||
Size=274,205
|
Size=274,205
|
||||||
|
Collapsed=1
|
||||||
|
|
||||||
|
@ -21,7 +21,7 @@ class ObjParser
|
|||||||
ObjParser(std::string &filename);
|
ObjParser(std::string &filename);
|
||||||
~ObjParser();
|
~ObjParser();
|
||||||
|
|
||||||
void parse(Scene &scene, glm::vec3 offset);
|
void parse(Scene &scene, glm::vec3 offset, float scale, glm::mat4 transform);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
glm::vec3 getVertex(std::stringstream &line);
|
glm::vec3 getVertex(std::stringstream &line);
|
||||||
|
@ -88,7 +88,9 @@ struct GPUBvh
|
|||||||
|
|
||||||
struct GPUBvhData
|
struct GPUBvhData
|
||||||
{
|
{
|
||||||
|
glm::mat4 transform;
|
||||||
alignas(16) glm::vec3 offset;
|
alignas(16) glm::vec3 offset;
|
||||||
|
float scale;
|
||||||
|
|
||||||
int bvh_start_index;
|
int bvh_start_index;
|
||||||
int triangle_start_index;
|
int triangle_start_index;
|
||||||
@ -111,7 +113,7 @@ class Scene
|
|||||||
void updateLightAndObjects(int mat_id);
|
void updateLightAndObjects(int mat_id);
|
||||||
std::set<int> getGPULights();
|
std::set<int> getGPULights();
|
||||||
|
|
||||||
void addBvh(std::vector<Triangle> &triangles, glm::vec3 offset);
|
void addBvh(std::vector<Triangle> &triangles, glm::vec3 offset, float scale, glm::mat4 transform);
|
||||||
|
|
||||||
const std::vector<GPUObject> &getObjectData() const;
|
const std::vector<GPUObject> &getObjectData() const;
|
||||||
const std::vector<GPUTriangle> &getTriangleData() const;
|
const std::vector<GPUTriangle> &getTriangleData() const;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
CAM 1.82501 0.45 -0.0162945 -10 180.6 0.02 2.164 30 5
|
CAM 1.82501 0.45 0 -10 180 0.005 2.164 35 5
|
||||||
|
|
||||||
|
|
||||||
MAT 255 255 255 0.0 1. 0.3 // white 0
|
MAT 255 255 255 0.0 1. 0.3 // white 0
|
||||||
@ -24,8 +24,8 @@ 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
|
||||||
|
|
||||||
OBJ obj/Dragon_80K.obj 0 0 0
|
OBJ obj/Dragon_80K.obj 0 0 0.5
|
||||||
OBJ obj/Dragon_80K.obj 0 0 1
|
OBJ obj/Dragon_80K.obj 0 0 -0.5 1 0 15 100
|
||||||
# OBJ obj/teapot.obj
|
# OBJ obj/teapot.obj
|
||||||
|
|
||||||
# OBJ obj/Model.obj
|
# OBJ obj/Model.obj
|
||||||
@ -33,4 +33,4 @@ OBJ obj/Dragon_80K.obj 0 0 1
|
|||||||
# OBJ obj/Lowpoly_tree_sample.obj
|
# OBJ obj/Lowpoly_tree_sample.obj
|
||||||
|
|
||||||
po -1.99 -0.5 -0.5 0 1 0 0 0 1 1 4
|
po -1.99 -0.5 -0.5 0 1 0 0 0 1 1 4
|
||||||
po -0.5 -0.5 -1.99 0 1 0 1 0 0 0 4
|
po 1.99 -0.5 -0.5 0 1 0 0 0 1 0 4
|
||||||
|
@ -63,7 +63,9 @@ struct GPUVolume
|
|||||||
|
|
||||||
struct GPUBvhData
|
struct GPUBvhData
|
||||||
{
|
{
|
||||||
|
mat4 transform;
|
||||||
vec3 offset;
|
vec3 offset;
|
||||||
|
float scale;
|
||||||
|
|
||||||
int bvh_start_index;
|
int bvh_start_index;
|
||||||
int triangle_start_index;
|
int triangle_start_index;
|
||||||
|
@ -69,7 +69,9 @@ layout(std430, binding = 2) buffer TriangleBuffer
|
|||||||
|
|
||||||
struct GPUBvhData
|
struct GPUBvhData
|
||||||
{
|
{
|
||||||
|
mat4 transform;
|
||||||
vec3 offset;
|
vec3 offset;
|
||||||
|
float scale;
|
||||||
|
|
||||||
int bvh_start_index;
|
int bvh_start_index;
|
||||||
int triangle_start_index;
|
int triangle_start_index;
|
||||||
@ -210,6 +212,44 @@ hitInfo traceBVH(Ray ray, GPUBvhData bvh_data, inout Stats stats)
|
|||||||
return (hit);
|
return (hit);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mat3 rotateX(float angleRadians) {
|
||||||
|
float c = cos(angleRadians);
|
||||||
|
float s = sin(angleRadians);
|
||||||
|
return mat3(
|
||||||
|
1.0, 0.0, 0.0,
|
||||||
|
0.0, c, -s,
|
||||||
|
0.0, s, c
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
mat3 rotateY(float angleRadians) {
|
||||||
|
float c = cos(angleRadians);
|
||||||
|
float s = sin(angleRadians);
|
||||||
|
return mat3(
|
||||||
|
c, 0.0, s,
|
||||||
|
0.0, 1.0, 0.0,
|
||||||
|
-s, 0.0, c
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
mat3 rotateZ(float angleRadians) {
|
||||||
|
float c = cos(angleRadians);
|
||||||
|
float s = sin(angleRadians);
|
||||||
|
return mat3(
|
||||||
|
c, -s, 0.0,
|
||||||
|
s, c, 0.0,
|
||||||
|
0.0, 0.0, 1.0
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
mat3 createTransformMatrix(vec3 rotationAngles, float scale) {
|
||||||
|
mat3 rotMatrix = rotateZ(rotationAngles.z) *
|
||||||
|
rotateY(rotationAngles.y) *
|
||||||
|
rotateX(rotationAngles.x);
|
||||||
|
|
||||||
|
return rotMatrix * scale;
|
||||||
|
}
|
||||||
|
|
||||||
hitInfo traverseBVHs(Ray ray, inout Stats stats)
|
hitInfo traverseBVHs(Ray ray, inout Stats stats)
|
||||||
{
|
{
|
||||||
hitInfo hit;
|
hitInfo hit;
|
||||||
@ -219,14 +259,25 @@ hitInfo traverseBVHs(Ray ray, inout Stats stats)
|
|||||||
|
|
||||||
for (int i = 0; i < u_bvhNum; i++)
|
for (int i = 0; i < u_bvhNum; i++)
|
||||||
{
|
{
|
||||||
ray.origin = i == 0 ? ray.origin : ray.origin + vec3(2., 0., 0.);
|
GPUBvhData bvh_data = BvhData[i];
|
||||||
hitInfo temp_hit = traceBVH(ray, BvhData[i], stats);
|
|
||||||
|
mat3 transformMatrix = mat3(bvh_data.transform);
|
||||||
|
mat3 inverseTransformMatrix = inverse(transformMatrix);
|
||||||
|
|
||||||
|
Ray transformedRay;
|
||||||
|
transformedRay.direction = normalize(transformMatrix * ray.direction);
|
||||||
|
transformedRay.origin = transformMatrix * (ray.origin - bvh_data.offset);
|
||||||
|
transformedRay.inv_direction = (1. / transformedRay.direction);
|
||||||
|
|
||||||
|
hitInfo temp_hit = traceBVH(transformedRay, BvhData[i], stats);
|
||||||
|
|
||||||
|
temp_hit.t = temp_hit.t / bvh_data.scale;
|
||||||
|
|
||||||
if (temp_hit.t < hit.t)
|
if (temp_hit.t < hit.t)
|
||||||
{
|
{
|
||||||
hit.t = temp_hit.t;
|
hit.t = temp_hit.t;
|
||||||
hit.obj_index = temp_hit.obj_index;
|
hit.obj_index = temp_hit.obj_index;
|
||||||
hit.normal = temp_hit.normal;
|
hit.normal = normalize(inverseTransformMatrix * temp_hit.normal);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -118,6 +118,36 @@ hitInfo traceBVH(Ray ray, GPUBvhData bvh_data)
|
|||||||
return (hit);
|
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 traverseBVHs(Ray ray)
|
||||||
{
|
{
|
||||||
hitInfo hit;
|
hitInfo hit;
|
||||||
@ -128,21 +158,28 @@ hitInfo traverseBVHs(Ray ray)
|
|||||||
for (int i = 0; i < u_bvhNum; i++)
|
for (int i = 0; i < u_bvhNum; i++)
|
||||||
{
|
{
|
||||||
GPUBvhData bvh_data = BvhData[i];
|
GPUBvhData bvh_data = BvhData[i];
|
||||||
|
|
||||||
|
mat3 transformMatrix = mat3(bvh_data.transform);
|
||||||
|
mat3 inverseTransformMatrix = inverse(transformMatrix);
|
||||||
|
|
||||||
ray.origin -= bvh_data.offset;
|
Ray transformedRay;
|
||||||
hitInfo temp_hit = traceBVH(ray, bvh_data);
|
transformedRay.direction = normalize(transformMatrix * ray.direction);
|
||||||
|
transformedRay.origin = transformMatrix * (ray.origin - bvh_data.offset);
|
||||||
|
transformedRay.inv_direction = (1. / transformedRay.direction);
|
||||||
|
|
||||||
|
hitInfo temp_hit = traceBVH(transformedRay, BvhData[i]);
|
||||||
|
|
||||||
|
temp_hit.t = temp_hit.t / bvh_data.scale;
|
||||||
|
|
||||||
if (temp_hit.t < hit.t)
|
if (temp_hit.t < hit.t)
|
||||||
{
|
{
|
||||||
hit.t = temp_hit.t;
|
hit.t = temp_hit.t;
|
||||||
hit.last_t = temp_hit.last_t;
|
hit.last_t = temp_hit.last_t / bvh_data.scale;
|
||||||
hit.obj_index = temp_hit.obj_index;
|
hit.obj_index = temp_hit.obj_index;
|
||||||
hit.mat_index = temp_hit.mat_index;
|
hit.mat_index = temp_hit.mat_index;
|
||||||
hit.position = temp_hit.position;
|
hit.position = inverseTransformMatrix * temp_hit.position + bvh_data.offset;
|
||||||
hit.normal = temp_hit.normal;
|
hit.normal = normalize(inverseTransformMatrix * temp_hit.normal);
|
||||||
}
|
}
|
||||||
|
|
||||||
ray.origin += bvh_data.offset;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return (hit);
|
return (hit);
|
||||||
|
@ -240,7 +240,7 @@ void ObjParser::parseMtl(std::stringstream &input_line, Scene &scene)
|
|||||||
file.close();
|
file.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ObjParser::parse(Scene &scene, glm::vec3 offset)
|
void ObjParser::parse(Scene &scene, glm::vec3 offset, float scale, glm::mat4 transform)
|
||||||
{
|
{
|
||||||
std::string line;
|
std::string line;
|
||||||
std::string identifier;
|
std::string identifier;
|
||||||
@ -275,6 +275,6 @@ void ObjParser::parse(Scene &scene, glm::vec3 offset)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
scene.addBvh(_triangles, offset);
|
scene.addBvh(_triangles, offset, scale, transform);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -142,7 +142,7 @@ void Scene::addObject(Object *obj)
|
|||||||
_gpu_objects.push_back(gpu_obj);
|
_gpu_objects.push_back(gpu_obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Scene::addBvh(std::vector<Triangle> &triangles, glm::vec3 offset)
|
void Scene::addBvh(std::vector<Triangle> &triangles, glm::vec3 offset, float scale, glm::mat4 transform)
|
||||||
{
|
{
|
||||||
GPUBvhData new_bvh_data;
|
GPUBvhData new_bvh_data;
|
||||||
std::vector<GPUBvh> new_bvhs_list;
|
std::vector<GPUBvh> new_bvhs_list;
|
||||||
@ -154,8 +154,9 @@ void Scene::addBvh(std::vector<Triangle> &triangles, glm::vec3 offset)
|
|||||||
BVH *bvh = new BVH(triangles, 0, triangles.size());
|
BVH *bvh = new BVH(triangles, 0, triangles.size());
|
||||||
new_bvhs_list = bvh->getGPUBvhs();
|
new_bvhs_list = bvh->getGPUBvhs();
|
||||||
|
|
||||||
std::cout << glm::to_string(offset) << std::endl;
|
new_bvh_data.transform = transform * scale;
|
||||||
new_bvh_data.offset = offset;
|
new_bvh_data.offset = offset;
|
||||||
|
new_bvh_data.scale = scale;
|
||||||
new_bvh_data.bvh_start_index = _gpu_bvh.size();
|
new_bvh_data.bvh_start_index = _gpu_bvh.size();
|
||||||
new_bvh_data.triangle_start_index = _gpu_triangles.size();
|
new_bvh_data.triangle_start_index = _gpu_triangles.size();
|
||||||
|
|
||||||
|
@ -102,11 +102,21 @@ void SceneParser::parseObj(std::stringstream &line)
|
|||||||
float y = 0.;
|
float y = 0.;
|
||||||
float z = 0.;
|
float z = 0.;
|
||||||
|
|
||||||
|
float scale = 1.;
|
||||||
|
|
||||||
|
float xtransform = 0.;
|
||||||
|
float ytransform = 0.;
|
||||||
|
float ztransform = 0.;
|
||||||
|
|
||||||
line >> name;
|
line >> name;
|
||||||
line >> x >> y >> z;
|
line >> x >> y >> z;
|
||||||
|
line >> scale;
|
||||||
|
line >> xtransform >> ytransform >> ztransform;
|
||||||
|
|
||||||
|
glm::mat4 transform = glm::eulerAngleXYZ(glm::radians(xtransform), glm::radians(ytransform), glm::radians(ztransform));
|
||||||
|
|
||||||
ObjParser obj(name);
|
ObjParser obj(name);
|
||||||
obj.parse(*_scene, glm::vec3(x, y, z));
|
obj.parse(*_scene, glm::vec3(x, y, z), (1.0 / scale), transform);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SceneParser::parseLine(const std::string &line)
|
bool SceneParser::parseLine(const std::string &line)
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user