Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion renderer/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@

---

## Diagnostics (1920x1080, 500 samples)
## Diagnostics (1920x1080, 128 samples)

<table>
<tr>
Expand Down
14 changes: 10 additions & 4 deletions renderer/core/include/scene.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,16 @@ class Scene {
std::vector<int> vertexIndices;
std::vector<glm::vec3> vertices;
std::vector<glm::vec2> texCoords;
glm::mat4 transform;
std::vector<Primitive> primitives;

Mesh() : transform(glm::mat4(1.0f)) {}
Mesh() = default;
};

struct Object {
Mesh mesh;
glm::mat4 transform;

Object() : transform(glm::mat4(1.0f)) {}
};

struct TextureData {
Expand Down Expand Up @@ -76,7 +82,7 @@ class Scene {

Camera camera;
Sun sun;
std::vector<Mesh> meshes;
std::vector<Object> objects;
std::vector<Material> materials;
glm::vec3 backgroundColor;

Expand All @@ -87,7 +93,7 @@ class Scene {
Camera getCamera() const noexcept;
Sun getSun() const noexcept;
glm::vec3 getBackgroundColor() const noexcept;
const std::vector<Mesh>& getMeshes() const noexcept;
const std::vector<Object>& getObjects() const noexcept;
const std::vector<Material>& getMaterials() const noexcept;
const std::vector<TextureData>& getTexturesData() const noexcept;
void setCamera(const Camera& camera);
Expand Down
10 changes: 5 additions & 5 deletions renderer/core/src/render-engine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -334,15 +334,15 @@ void RenderEngine::uploadGPUBuffers(const GPUData& gpuData, const BVH& bvh) {
RenderEngine::GPUData RenderEngine::convertSceneToGPUData(const Scene& scene) {
logger.debug("Preparing scene data for GPU");
GPUData data;
for (const auto& mesh : scene.getMeshes()) {
for (const auto& object : scene.getObjects()) {
int indexOffset = data.vertices.size();
for (const auto& v : mesh.vertices) data.vertices.push_back(mesh.transform * glm::vec4(v, 1.0));
for (const auto& uv : mesh.texCoords) data.texCoords.push_back(glm::vec4(uv.x, uv.y, 1.0f, 1.0f));
for (const auto& v : object.mesh.vertices) data.vertices.push_back(object.transform * glm::vec4(v, 1.0));
for (const auto& uv : object.mesh.texCoords) data.texCoords.push_back(glm::vec4(uv.x, uv.y, 1.0f, 1.0f));

for (const auto& primitive : mesh.primitives) {
for (const auto& primitive : object.mesh.primitives) {
for (int i = primitive.startVertexIndex; i < primitive.vertexIndicesCount + primitive.startVertexIndex;
i++) {
data.vertexIndices.push_back(mesh.vertexIndices[i] + indexOffset);
data.vertexIndices.push_back(object.mesh.vertexIndices[i] + indexOffset);
}
for (int i = 0; i < primitive.vertexIndicesCount / 3; i++) {
data.materialIndices.push_back(primitive.materialId);
Expand Down
41 changes: 21 additions & 20 deletions renderer/core/src/scene-loader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -172,10 +172,11 @@ void SceneLoader::loadNode(const fastgltf::Node& node, const fastgltf::Asset& as

/* Loading meshes*/
if (node.meshIndex.has_value()) {
Scene::Object object;
const auto& gltfMesh = asset.meshes[node.meshIndex.value()];
Scene::Mesh mesh = loadMesh(gltfMesh, asset);
mesh.transform = transform;
scene.meshes.push_back(std::move(mesh));
object.mesh = loadMesh(gltfMesh, asset);
object.transform = transform;
scene.objects.push_back(std::move(object));
}
for (const auto& child : node.children) {
loadNode(asset.nodes[child], asset, scene, transform);
Expand Down Expand Up @@ -326,9 +327,9 @@ Scene SceneLoader::loadGltf(const fastgltf::Asset& asset) {
logger.warning("Camera was not found in file. Default camera will be applied");
glm::vec3 boxMax(-std::numeric_limits<float>::infinity()), boxMin(std::numeric_limits<float>::infinity());
bool empty = true;
for (const auto& mesh : scene.getMeshes()) {
for (auto v : mesh.vertices) {
v = glm::vec3(mesh.transform * glm::vec4(v, 1.0));
for (const auto& object : scene.getObjects()) {
for (auto v : object.mesh.vertices) {
v = glm::vec3(object.transform * glm::vec4(v, 1.0));
empty = false;
boxMax = glm::max(boxMax, v);
boxMin = glm::min(boxMin, v);
Expand Down Expand Up @@ -356,17 +357,17 @@ Scene SceneLoader::loadGltf(const fastgltf::Asset& asset) {
for (const auto& material : asset.materials) {
scene.materials.push_back(loadMaterial(material, scene.textures, asset));
}
logger.info(std::format("Scene loaded. Meshes: {}, Materials: {}, Textures: {}", scene.meshes.size(),
logger.info(std::format("Scene loaded. Meshes: {}, Materials: {}, Textures: {}", scene.objects.size(),
scene.materials.size(), scene.textures.size()));
return scene;
}

void SceneLoader::addPlane(Scene& scene, float planeSize) {
glm::vec3 boxMax(-std::numeric_limits<float>::infinity()), boxMin(std::numeric_limits<float>::infinity());
bool empty = true;
for (const auto& mesh : scene.getMeshes()) {
for (auto v : mesh.vertices) {
v = glm::vec3(mesh.transform * glm::vec4(v, 1.0));
for (const auto& object : scene.getObjects()) {
for (auto v : object.mesh.vertices) {
v = glm::vec3(object.transform * glm::vec4(v, 1.0));
empty = false;
boxMax = glm::max(boxMax, v);
boxMin = glm::min(boxMin, v);
Expand All @@ -378,13 +379,13 @@ void SceneLoader::addPlane(Scene& scene, float planeSize) {
} else {
center = glm::vec3(0, 0, 0);
}
Scene::Mesh planeMesh;
planeMesh.transform = glm::mat4(1.0);
planeMesh.vertices = {glm::vec3(center.x - planeSize, boxMin.y, center.z + planeSize),
glm::vec3(center.x - planeSize, boxMin.y, center.z - planeSize),
glm::vec3(center.x + planeSize, boxMin.y, center.z - planeSize),
glm::vec3(center.x + planeSize, boxMin.y, center.z + planeSize)};
planeMesh.vertexIndices = {3, 1, 0, 2, 1, 3};
Scene::Object plane;
plane.transform = glm::mat4(1.0);
plane.mesh.vertices = {glm::vec3(center.x - planeSize, boxMin.y, center.z + planeSize),
glm::vec3(center.x - planeSize, boxMin.y, center.z - planeSize),
glm::vec3(center.x + planeSize, boxMin.y, center.z - planeSize),
glm::vec3(center.x + planeSize, boxMin.y, center.z + planeSize)};
plane.mesh.vertexIndices = {3, 1, 0, 2, 1, 3};

Scene::Mesh::Primitive primitive1, primitive2;
primitive1.startVertexIndex = 0;
Expand All @@ -395,8 +396,8 @@ void SceneLoader::addPlane(Scene& scene, float planeSize) {
primitive1.materialId = scene.materials.size() - 1;
primitive2.materialId = scene.materials.size() - 1;

planeMesh.primitives.push_back(primitive1);
planeMesh.primitives.push_back(primitive2);
plane.mesh.primitives.push_back(primitive1);
plane.mesh.primitives.push_back(primitive2);

scene.meshes.push_back(planeMesh);
scene.objects.push_back(plane);
}
2 changes: 1 addition & 1 deletion renderer/core/src/scene.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ Scene::Scene() : backgroundColor(0.0f, 0.0f, 0.0f) {}
Scene::Camera Scene::getCamera() const noexcept { return camera; }
glm::vec3 Scene::getBackgroundColor() const noexcept { return backgroundColor; }
Scene::Sun Scene::getSun() const noexcept { return sun; }
const std::vector<Scene::Mesh>& Scene::getMeshes() const noexcept { return meshes; }
const std::vector<Scene::Object>& Scene::getObjects() const noexcept { return objects; }
const std::vector<Scene::Material>& Scene::getMaterials() const noexcept { return materials; }
const std::vector<Scene::TextureData>& Scene::getTexturesData() const noexcept { return textures; }
void Scene::setCamera(const Scene::Camera& camera) { this->camera = camera; }
Expand Down
Binary file modified renderer/images/fox-heat.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified renderer/images/fox-raw.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified renderer/images/fox.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
12 changes: 8 additions & 4 deletions renderer/shaders/path-tracing.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -511,13 +511,17 @@ void main() {

float variance = 0.0;
float error = 0.0;
float stdError = 0.0;
if (N >= 2) {
variance = M2 / float(N - 1);
error = sqrt(variance / float(N)) / (abs(mean) + 0.0001);
float variance = M2 / float(N - 1);
stdError = sqrt(variance / float(N));
}
imageStore(heatMap, pixel, vec4(heatColor(error), 1.0));
float lo = log(1e-3);
float hi = log(1e-2);
float t = clamp((log(max(stdError, 1e-8)) - lo) / (hi - lo), 0.0, 1.0);
imageStore(heatMap, pixel, vec4(heatColor(t), 1.0));

if (N >= 32 && error < 0.01) {
if (N >= 32 && stdError < 0.001) {
return;
}

Expand Down
9 changes: 5 additions & 4 deletions renderer/tests/scene-loader/test-scene-loader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,10 @@ TEST(SceneLoaderTest, loadSceneCorrectly) {
EXPECT_NO_THROW(scene = loader.loadGltfFromFile("tests/data/test-scene.glb"));

/* Testing geometry */
const auto& meshes = scene.getMeshes();
ASSERT_EQ(meshes.size(), 1);
const auto& mesh = meshes[0];
const auto& objects = scene.getObjects();
ASSERT_EQ(objects.size(), 1);
const auto& object = objects[0];
const auto& mesh = object.mesh;

std::vector<glm::vec3> expectedVertices = {
glm::vec3(0.5, -0.5, 0.5), glm::vec3(-0.5, -0.5, 0.5), glm::vec3(0.5, 0.5, 0.5),
Expand Down Expand Up @@ -62,7 +63,7 @@ TEST(SceneLoaderTest, loadSceneCorrectly) {
{0.9397, 0.6840, 0, 2}, {0, 0, 1, 0}, {0.3420, -1.8794, 0, 0}, {0, 0, 0, 1}};
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
EXPECT_NEAR(mesh.transform[i][j], expectedTransform[j][i], 0.001);
EXPECT_NEAR(object.transform[i][j], expectedTransform[j][i], 0.001);
}
}

Expand Down
Loading