STABLE RELEASE - new framebuffer works, gamma slider fixed
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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() {
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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)));
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user