STABLE RELEASE - new framebuffer works, gamma slider fixed

This commit is contained in:
Ben Kyd
2019-09-10 14:49:44 +01:00
parent 5a06e9d56e
commit 5a3d4539af
7 changed files with 51 additions and 21 deletions

View File

@@ -61,15 +61,6 @@ void FrameBuffer::RenderPostProcessSafe(int x, int y, glm::vec3 p) {
} }
} }
uint32_t FrameBuffer::FinalProcess(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)
};
return pixel.rgb();
}
void FrameBuffer::RenderSetPixelSafe(int x, int y, uint32_t p) { void FrameBuffer::RenderSetPixelSafe(int x, int y, uint32_t p) {
if (x >= 0 && x < this->XRes && y >= 0 && this->YRes) { if (x >= 0 && x < this->XRes && y >= 0 && this->YRes) {
RenderData[y * this->XRes + x] = p; RenderData[y * this->XRes + x] = p;
@@ -106,9 +97,35 @@ void FrameBuffer::PostProcess(ToneMapMode mode) {
m_swapBuffer[y * this->XRes + x] = Clamp(RenderPostProcess[y * this->XRes + x], 1.0f, 0.0f); m_swapBuffer[y * this->XRes + x] = Clamp(RenderPostProcess[y * this->XRes + x], 1.0f, 0.0f);
} }
} else {
for (int x = 0; x < XRes; x++)
for (int y = 0; y < YRes; y++) {
m_swapBuffer[y * this->XRes + x] = Clamp(RenderPostProcess[y * this->XRes + x], 1.0f, 0.0f);
}
}
for (int x = 0; x < XRes; x++)
for (int y = 0; y < YRes; y++) {
RenderPostProcess[y * this->XRes + x] = m_swapBuffer[y * this->XRes + x];
} }
} }
uint32_t FrameBuffer::FinalProcess(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)
};
return pixel.rgb();
}
void FrameBuffer::Ready() {
for (int x = 0; x < XRes; x++)
for (int y = 0; y < YRes; y++) {
uint32_t p = FinalProcess(RenderPostProcess[y * this->XRes + x]);
RenderSetPixelSafe(x, y, p);
}
}
void FrameBuffer::DumpToFile(std::string path) { 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); // int stbi_write_png(char const* filename, int w, int h, int comp, const void* data, int stride_in_bytes);

View File

@@ -33,10 +33,6 @@ public:
// for display gamma and to be transposed over to the data buffer // for display gamma and to be transposed over to the data buffer
void RenderPostProcessSafe(int x, int y, glm::vec3 p); void RenderPostProcessSafe(int x, int y, glm::vec3 p);
// Finally, the pixel is ready to be rendered to the data buffer,
// this method adjusts for gamma and scales back to do the last set
uint32_t FinalProcess(glm::vec3 p);
// Sets a pixel on the RenderData framebuffer, ready for rendering // Sets a pixel on the RenderData framebuffer, ready for rendering
// by the display or whatever mode the engine is in. the framebuffer // by the display or whatever mode the engine is in. the framebuffer
// doesnt care. // doesnt care.
@@ -51,6 +47,14 @@ public:
// if it doesnt exist already // if it doesnt exist already
void PostProcess(ToneMapMode mode = MODE_TONEMAP_CLAMP); void PostProcess(ToneMapMode mode = MODE_TONEMAP_CLAMP);
// Finally, the pixel is ready to be rendered to the data buffer,
// this method adjusts for gamma and scales back to do the last set
uint32_t FinalProcess(glm::vec3 p);
// Converts the PostProcessed Framebuffer back into a uint32_t
// buffer and processes each pixel, scaling it by gamma
void Ready();
// Saves the RenderData to a file, data must first be processed // Saves the RenderData to a file, data must first be processed
// by the render engine / the engine manager based on mode // by the render engine / the engine manager based on mode
void DumpToFile(std::string path); void DumpToFile(std::string path);

View File

@@ -109,7 +109,9 @@ void ProgressiveRenderer::Render() {
m_threadPool->ThreadFrameBuffer->PostProcess((ToneMapMode)m_toneMapModeSelected); m_threadPool->ThreadFrameBuffer->PostProcess((ToneMapMode)m_toneMapModeSelected);
m_threadPool->MergeBuffers(m_interface->Framebuffer->RenderData, m_scene->w, m_scene->h); m_threadPool->MergeBuffers(m_interface->Framebuffer);
m_interface->Framebuffer->Ready();
m_threadPool->RunJobsAgain(); m_threadPool->RunJobsAgain();
frameEndTime = std::chrono::high_resolution_clock::now(); frameEndTime = std::chrono::high_resolution_clock::now();

View File

@@ -45,7 +45,7 @@ void workerThread(RenderThreadPool* threadpool, ProgressiveRenderer* renderer, i
glm::vec3 col = renderer->m_engine->GetColour(ray, depth); glm::vec3 col = renderer->m_engine->GetColour(ray, depth);
if (renderer->m_engine->Mode == MODE_RENDER_NORMALS || renderer->m_engine->Mode == MODE_RENDER_PATH_LENGTH) { if (renderer->m_engine->Mode == MODE_RENDER_NORMALS || renderer->m_engine->Mode == MODE_RENDER_PATH_LENGTH) {
threadpool->ThreadFrameBuffer->SetPixelSafe(x, y, col); threadpool->ThreadFrameBuffer->SetPixelSafe(x, y, col, (int)renderer->m_engine->Mode);
} else if (renderer->m_engine->Mode == MODE_RENDER_PATH_BOUNCES) { } else if (renderer->m_engine->Mode == MODE_RENDER_PATH_BOUNCES) {
col.r = depth; col.g = depth / 3.0f; col.b = depth / 3.0f; col.r = depth; col.g = depth / 3.0f; col.b = depth / 3.0f;
threadpool->ThreadFrameBuffer->AddPixelSafe(x, y, col, (int)renderer->m_engine->Mode); threadpool->ThreadFrameBuffer->AddPixelSafe(x, y, col, (int)renderer->m_engine->Mode);

View File

@@ -61,8 +61,12 @@ void RenderThreadPool::RunJobsAgain() {
ThreadLock.unlock(); ThreadLock.unlock();
} }
void RenderThreadPool::MergeBuffers(uint32_t* framebuffer, int w, int h) { void RenderThreadPool::MergeBuffers(FrameBuffer* framebuffer) {
memcpy((void*)framebuffer, (void*)ThreadFrameBuffer->RenderData, (w * h) * sizeof(uint32_t)); memcpy((void*)framebuffer->RenderNormalsTarget, (void*)ThreadFrameBuffer->RenderNormalsTarget, (framebuffer->XRes * framebuffer->YRes) * sizeof(glm::vec3));
memcpy((void*)framebuffer->RenderAlbedoTarget, (void*)ThreadFrameBuffer->RenderAlbedoTarget, (framebuffer->XRes * framebuffer->YRes) * sizeof(glm::vec3));
memcpy((void*)framebuffer->RenderTarget, (void*)ThreadFrameBuffer->RenderTarget, (framebuffer->XRes * framebuffer->YRes) * sizeof(glm::vec3));
memcpy((void*)framebuffer->RenderPostProcess, (void*)ThreadFrameBuffer->RenderPostProcess, (framebuffer->XRes * framebuffer->YRes) * sizeof(glm::vec3));
memcpy((void*)framebuffer->RenderData, (void*)ThreadFrameBuffer->RenderData, (framebuffer->XRes * framebuffer->YRes) * sizeof(uint32_t));
} }
void RenderThreadPool::Destroy() { void RenderThreadPool::Destroy() {

View File

@@ -29,7 +29,10 @@ public:
void RunJobsAgain(); void RunJobsAgain();
void Destroy(); void Destroy();
void MergeBuffers(uint32_t* framebuffer, int w, int h); // Merges threadpools active framebuffer with argument 0
// sets the data from local to that one. not exaclty merging
// but whatever
void MergeBuffers(FrameBuffer* framebuffer);
// std::vector<std::tuple<int, int>> RenderRegions; // offest, size // std::vector<std::tuple<int, int>> RenderRegions; // offest, size
FrameBuffer* ThreadFrameBuffer; FrameBuffer* ThreadFrameBuffer;

View File

@@ -2,8 +2,8 @@
#include "../src/inferno.hpp" #include "../src/inferno.hpp"
static const int width = 300; static const int width = 500;
static const int height = 300; static const int height = 500;
int main(int argc, char** argv) { int main(int argc, char** argv) {
InfernoEngine inferno; InfernoEngine inferno;
@@ -19,7 +19,7 @@ int main(int argc, char** argv) {
Scene* scene = new Scene(width, height); Scene* scene = new Scene(width, height);
scene->camera = new Camera(width, height); scene->camera = new Camera(width, height);
scene->objects.push_back(new Sphere({ 0.0f, 0.0f, -4.0f }, 1.0f, new Material({ 1.0f, 1.0f, 1.0f }, 0.0f, 5.0f))); scene->objects.push_back(new Sphere({ 0.0f, 0.0f, -4.0f }, 1.0f, new Material({ 1.0f, 1.0f, 1.0f }, 0.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({ 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 Plane( { 0.0f, -1.0f, 0.0f }, { 0.0f, -1.0f, 0.0f }, new Material({ 0.847f, 0.792f, 0.658f }, 0.2f))); 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)));