BROKEN BUILD - Redoing framebuffer and documenting code better in preperation for denoising

This commit is contained in:
Ben
2019-09-08 23:37:03 +01:00
parent 445a5ea058
commit ae9e4dbb73
8 changed files with 142 additions and 99 deletions

View File

@@ -1,62 +0,0 @@
# Blender MTL File: 'None'
# Material Count: 6
newmtl backWall
Ns 9.803921
Ka 1.000000 1.000000 1.000000
Kd 0.725000 0.710000 0.680000
Ks 0.000000 0.000000 0.000000
Ke 0.0 0.0 0.0
Ni 1.000000
d 1.000000
illum 1
newmtl ceiling
Ns 9.803921
Ka 1.000000 1.000000 1.000000
Kd 0.725000 0.710000 0.680000
Ks 0.000000 0.000000 0.000000
Ke 0.0 0.0 0.0
Ni 1.000000
d 1.000000
illum 1
newmtl floor
Ns 9.803921
Ka 1.000000 1.000000 1.000000
Kd 0.725000 0.710000 0.680000
Ks 0.000000 0.000000 0.000000
Ke 0.0 0.0 0.0
Ni 1.000000
d 1.000000
illum 1
newmtl leftWall
Ns 9.803921
Ka 1.000000 1.000000 1.000000
Kd 0.750000 0.250000 0.250000
Ks 0.000000 0.000000 0.000000
Ke 0.0 0.0 0.0
Ni 1.500000
d 1.000000
illum 1
newmtl light
Ns 9.803921
Ka 1.000000 1.000000 1.000000
Kd 0.780000 0.780000 0.780000
Ks 0.000000 0.000000 0.000000
Ke 0.0 0.0 0.0
Ni 1.000000
d 1.000000
illum 1
newmtl rightWall
Ns 9.803921
Ka 1.000000 1.000000 1.000000
Kd 0.250000 0.250000 0.750000
Ks 0.000000 0.000000 0.000000
Ke 0.0 0.0 0.0
Ni 1.500000
d 1.000000
illum 1

View File

@@ -17,15 +17,6 @@ enum OperationMode {
MODE_OPERATION_PROGRESSIVE_GUI,
MODE_OPERATION_PROGRESSIVE_IMG,
MODE_OPERATION_SAMPLES_IMG,
MODE_OPERATION_DEFAULT
};
enum RenderMode {
MODE_RENDER_PATHTRACE,
MODE_RENDER_NORMALS,
MODE_RENDER_PATH_BOUNCES,
MODE_RENDER_PATH_LENGTH,
MODE_RENDER_DEFAULT
};
enum AccelerationMode {
@@ -33,7 +24,19 @@ enum AccelerationMode {
MODE_ACCELERATION_KD,
MODE_ACCELERATION_KD_SLOW,
MODE_ACCELERATION_BVH,
MODE_ACCELERATION_DEFAULT
};
enum RenderMode {
MODE_RENDER_PATHTRACE,
MODE_RENDER_NORMALS,
MODE_RENDER_PATH_BOUNCES,
MODE_RENDER_PATH_LENGTH
};
enum ToneMapMode {
MODE_TONEMAP_BASIC,
MODE_TONEMAP_CLAMP
};
#endif

View File

@@ -5,11 +5,6 @@
#include "../pixel.hpp"
FrameBuffer::FrameBuffer(int xres, int yres) {
XRes = xres; YRes = yres;
Data = (uint32_t*)malloc((xres * yres) * sizeof(uint32_t));
memset((void*)Data, 0, (xres * yres) * sizeof(uint32_t));
}
void FrameBuffer::SetPixel(int x, int y, glm::vec3 p) {
Pixel pixel{ (uint8_t)(pow(p.r, Gamma) * 255.0f), (uint8_t)(pow(p.g, Gamma) * 255.0f), (uint8_t)(pow(p.b, Gamma) * 255.0f) };
@@ -23,6 +18,13 @@ void FrameBuffer::SetPixelSafe(int x, int y, glm::vec3 p) {
}
}
void FrameBuffer::SetPixelSafe(int x, int y, glm::vec3 p) {
if (x >= 0 && x < this->XRes && y >= 0 && this->YRes) {
Pixel pixel{ (uint8_t)(pow(p.r, Gamma) * 255.0f), (uint8_t)(pow(p.g, Gamma) * 255.0f), (uint8_t)(pow(p.b, Gamma) * 255.0f) };
Data[y * this->XRes + x] = pixel.rgb();
}
}
void FrameBuffer::DumpToFile(std::string path) {
// int stbi_write_png(char const* filename, int w, int h, int comp, const void* data, int stride_in_bytes);
stbi_write_png(path.c_str(), this->XRes, this->YRes, sizeof(uint32_t), this->Data, sizeof(uint32_t) * this->XRes);
@@ -40,3 +42,70 @@ void FrameBuffer::ClearFramebuffer() {
FrameBuffer::~FrameBuffer() {
free(Data);
}
FrameBuffer::FrameBuffer(int xres, int yres) {
XRes = xres; YRes = yres;
RenderData = (uint32_t*)malloc((xres * yres) * sizeof(uint32_t));
memset((void*)RenderData, 0, (xres * yres) * sizeof(uint32_t));
RenderNormalsTarget = (glm::vec3*)malloc((xres * yres) * sizeof(glm::vec3));
memset((void*)RenderNormalsTarget, 0, (xres * yres) * sizeof(glm::vec3));
RenderAlbedoTarget = (glm::vec3*)malloc((xres * yres) * sizeof(glm::vec3));
memset((void*)RenderAlbedoTarget, 0, (xres * yres) * sizeof(glm::vec3));
RenderTarget = (glm::vec3*)malloc((xres * yres) * sizeof(glm::vec3));
memset((void*)RenderTarget, 0, (xres * yres) * sizeof(glm::vec3));
RenderPostProcess = (glm::vec3*)malloc((xres * yres) * sizeof(glm::vec3));
memset((void*)RenderPostProcess, 0, (xres * yres) * sizeof(glm::vec3));
}
void FrameBuffer::SetPixelSafeNormal(int x, int y, glm::vec3 p) {
if (x >= 0 && x < this->XRes && y >= 0 && this->YRes) {
RenderNormalsTarget[y * this->XRes + x] = p;
}
}
void FrameBuffer::SetPixelSafeAlbedo(int x, int y, glm::vec3 p) {
if (x >= 0 && x < this->XRes && y >= 0 && this->YRes) {
RenderAlbedoTarget[y * this->XRes + x] = p;
}
}
void FrameBuffer::SetPixelSafe(int x, int y, glm::vec3 p, int mode = 0) {
if (x >= 0 && x < this->XRes && y >= 0 && this->YRes) {
if (m_lastActiveFrameBufferMode != mode) { ClearFramebuffer(); }
m_lastActiveFrameBufferMode = mode;
RenderTarget[y * this->XRes + x] = p;
}
}
void FrameBuffer::AddPixelSafe(int x, int y, glm::vec3 p, int mode = 0) {
if (x >= 0 && x < this->XRes && y >= 0 && this->YRes) {
if (m_lastActiveFrameBufferMode != mode) { ClearFramebuffer(); }
m_lastActiveFrameBufferMode = mode;
RenderTarget[y * this->XRes + x] += p;
}
}
// PostProcesses based on previous input, the tonemap mode and
// the sample count for additive frames to average
void PostProcess(int spp, ToneMapMode mode = MODE_TONEMAP_CLAMP);
// Saves the RenderData to a file, data must first be processed
// by the render engine / the engine manager based on mode
void DumpToFile(std::string path);
// Copys the active render data to the target framebuffer,
// relies on the framebuffers to be of equal size and not
// not that
void CopyData(uint32_t* dest);
// Clears the RenderTarget and the RenderData
void ClearFramebuffer();
~FrameBuffer();

View File

@@ -12,19 +12,54 @@ class FrameBuffer {
public:
FrameBuffer(int xres, int yres);
void SetPixel(int x, int y, glm::vec3 p);
void SetPixelSafe(int x, int y, glm::vec3 p);
// Normals are expected to be mapped as -1 to 1 on the RGB
// channels, 0 to 1 is not acceptable. For maximum detail
// the accumilation of normal maps should be preserved
void SetPixelSafeNormal(int x, int y, glm::vec3 p);
// Albedo values are expected to be the basic colour of the
// first hit surface. Mapped between 0 and 1 for intensity on
// the RGB channels
void SetPixelSafeAlbedo(int x, int y, glm::vec3 p);
// Sets main targeted render. Usually copied to from the thread
// pools internal buffers
void SetPixelSafe(int x, int y, glm::vec3 p, int mode = 0);
// Add to the render target
void AddPixelSafe(int x, int y, glm::vec3 p, int mode = 0);
// PostProcesses based on previous input, the tonemap mode and
// the sample count for additive frames to average
void PostProcess(int spp, ToneMapMode mode = MODE_TONEMAP_CLAMP);
// Saves the RenderData to a file, data must first be processed
// by the render engine / the engine manager based on mode
void DumpToFile(std::string path);
void SetFramebuffer(uint32_t* fb);
// Copys the active render data to the target framebuffer,
// relies on the framebuffers to be of equal size and not
// not that
void CopyData(uint32_t* dest);
// Clears the RenderTarget, Post Processed target
// and the RenderData
void ClearFramebuffer();
uint32_t* Data;
// Render targets
glm::vec3* RenderNormalsTarget;
glm::vec3* RenderAlbedoTarget;
glm::vec3* RenderTarget;
glm::vec3* RenderPostProcess;
uint32_t* RenderData;
int XRes, YRes;
float Gamma = 1.0f / 2.3f;
~FrameBuffer();
private:
int m_lastActiveFrameBufferMode;
};
#endif

View File

@@ -42,10 +42,13 @@ void ProgressiveRenderer::Input() {
const Uint8* state = SDL_GetKeyboardState(NULL);
//if (state[SDL_SCANCODE_W]) m_scene->objects[0]->center.y += 0.01f;
//if (state[SDL_SCANCODE_S]) m_scene->objects[0]->center.y -= 0.01f;
//if (state[SDL_SCANCODE_D]) m_scene->objects[0]->center.x += 0.01f;
//if (state[SDL_SCANCODE_A]) m_scene->objects[0]->center.x -= 0.01f;
//if (state[SDL_SCANCODE_W]) m_scene->objects[1]->center.y += 0.001f;
//if (state[SDL_SCANCODE_S]) m_scene->objects[1]->center.y -= 0.001f;
//if (state[SDL_SCANCODE_D]) m_scene->objects[1]->center.x += 0.001f;
//if (state[SDL_SCANCODE_A]) m_scene->objects[1]->center.x -= 0.001f;
//if (state[SDL_SCANCODE_R]) m_scene->objects[1]->center.z += 0.001f;
//if (state[SDL_SCANCODE_F]) m_scene->objects[1]->center.z -= 0.001f;
//std::cout << m_scene->objects[1]->center.x << " " << m_scene->objects[1]->center.y << " " << m_scene->objects[1]->center.z << std::endl;
if (!m_interface->ImGui) return;

View File

@@ -18,7 +18,6 @@ RenderThreadPool::RenderThreadPool() {
};
void RenderThreadPool::SetJobs(ProgressiveRenderer* renderer, int w, int h) {
MappedThreadFrameBuffer = new ToneMapFrameBuffer(w, h);
ThreadFrameBuffer = new FrameBuffer(w, h);
for (int i = 0; i < ThreadCount; i++) {
if (i == ThreadCount - 1) {

View File

@@ -32,7 +32,6 @@ public:
void MergeBuffers(uint32_t* framebuffer, int w, int h);
// std::vector<std::tuple<int, int>> RenderRegions; // offest, size
ToneMapFrameBuffer* MappedThreadFrameBuffer;
FrameBuffer* ThreadFrameBuffer;
};

View File

@@ -17,13 +17,10 @@ int main(int argc, char** argv) {
Scene* scene = new Scene(width, height);
scene->camera = new Camera(width, height);
// scene->objects.push_back(new Sphere({ 0.0f, 0.0f, -8.0f }, 1.0f, new Material({ 1.0f, 1.0f, 1.0f }, 0.7f)));
// scene->objects.push_back(new Sphere({ 2.0f, 0.0f, -6.0f }, 1.0f, new Material({ 1.0f, 1.0f, 1.0f }, 0.0f)));
// scene->objects.push_back(new Sphere({ -2.0f, 0.0f, -9.0f }, 1.0f, new Material({ 1.0f, 1.0f, 1.0f }, 0.0f)));
scene->objects.push_back(new Sphere({ 25.0f, 26.0f, 25.0f }, 15.0f, new Material({ 1.0f, 1.0f, 1.0f }, 0.0f, 5.0f)));
scene->objects.push_back(new Plane( { 0.0f,-1.0f, 0.0f }, { 0.0f, -1.0f, 0.0f }, new Material({ 0.847f, 0.792f, 0.658f }, 0.3f)));
// scene->objects.push_back(new Plane( { 0.0f, 10.0f, 0.0f }, { 1.0f, 1.0f, 1.0f }, new Material({ 1.0f, 0.9f, 0.9f }, 0.0f, 1.0f)));
scene->objects.push_back(new Sphere({ 35.0f, 26.0f, 25.0f }, 15.0f, new Material({ 1.0f, 1.0f, 1.0f }, 0.0f, 5.0f)));
scene->objects.push_back(new Sphere({-0.457001f, 0.19f, -3.53899f}, 0.02f, new Material({ 1.0f, 0.9f, 0.8f }, 0.0f, 500.0f)));
scene->objects.push_back(new Plane( { 0.0f, -1.0f, 0.0f }, { 0.0f, -1.0f, 0.0f }, new Material({ 0.847f, 0.792f, 0.658f }, 0.2f)));
std::vector<Triangle*> tris = LoadTrianglesBasic("E://Projects//Inferno//resources//dragon-normals.obj", "E://Projects//Inferno//resources");
// std::vector<Triangle*> tris = LoadTrianglesBasic("//home//ben//programming//inferno//resources//dragon-normals.obj", "//home//ben//programming//inferno//resources//resources");
@@ -36,11 +33,11 @@ int main(int argc, char** argv) {
//mesh->Optimise();
//scene->meshs.push_back(mesh);
//std::vector<Triangle*> tris = LoadTrianglesBasic("E://Projects//Inferno//resources//cornell-box.obj", "E://Projects//Inferno//resources");
// std::vector<Triangle*> tris = LoadTrianglesBasic("//home//ben//programming//inferno//resources//cornell.obj", "//home//ben//programming//inferno//resources//resources");
//std::vector<Triangle*> tris = LoadTrianglesBasic("E://Projects//Inferno//resources//box.obj", "E://Projects//Inferno//resources");
//std::vector<Triangle*> tris = LoadTrianglesBasic("//home//ben//programming//inferno//resources//cornell.obj", "//home//ben//programming//inferno//resources//resources");
Mesh* mesh1 = new Mesh(tris);
mesh1->Translate({ 0.0f, -1.0f, -3.8f });
mesh1->Translate({ 0.2f, -1.04, -3.8f });
mesh1->Optimise();
scene->meshs.push_back(mesh1);