add oidn
This commit is contained in:
parent
351a5d842e
commit
8b54ca0216
10 changed files with 87 additions and 20 deletions
|
|
@ -12,7 +12,8 @@ add_library(${PROJECT_NAME} STATIC ${SOURCES} ${HEADERS})
|
|||
|
||||
target_include_directories(${PROJECT_NAME} PUBLIC ./public/ ${BINDINGS_INCLUDE} ./ext/)
|
||||
target_link_libraries(${PROJECT_NAME} PUBLIC Widgets RasterRender RayTracer)
|
||||
target_link_libraries(${PROJECT_NAME} PUBLIC ${BINDINGS_LIBS})
|
||||
target_link_libraries(${PROJECT_NAME} PRIVATE ${BINDINGS_LIBS})
|
||||
target_link_libraries(${PROJECT_NAME} PRIVATE OpenImageDenoise)
|
||||
|
||||
### -------------------------- Applications -------------------------- ###
|
||||
file(GLOB APP_SOURCES "./applications/*.cpp")
|
||||
|
|
|
|||
40
3DEditor/private/Denoise.cpp
Normal file
40
3DEditor/private/Denoise.cpp
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
|
||||
#include "Editor.hpp"
|
||||
|
||||
#include "OpenImageDenoise/oidn.hpp"
|
||||
#include <iostream>
|
||||
|
||||
using namespace tp;
|
||||
|
||||
void Editor::denoise() {
|
||||
auto& out = mPathTracerBuffers;
|
||||
|
||||
// Initialize OIDN device
|
||||
oidn::DeviceRef device = oidn::newDevice(oidn::DeviceType::CPU);
|
||||
device.commit();
|
||||
|
||||
// Define buffer size
|
||||
const int channels = 4; // ARGB
|
||||
const auto size = out.color.size();
|
||||
// Create the denoising filter
|
||||
oidn::FilterRef filter = device.newFilter("RT"); // Use the 'RT' filter for path tracing
|
||||
|
||||
// Set the input and output buffer (same buffer for in-place denoising)
|
||||
filter.setImage("color", out.color.getBuff(), oidn::Format::Float3, size.x, size.y, 0, sizeof(float) * channels); // ARGB
|
||||
filter.setImage("output", out.color.getBuff(), oidn::Format::Float3, size.x, size.y, 0, sizeof(float) * channels); // ARGB
|
||||
|
||||
// Set additional parameters if needed
|
||||
filter.set("hdr", false); // Assuming the input image is not HDR
|
||||
|
||||
// Commit the filter
|
||||
filter.commit();
|
||||
|
||||
// Execute the filter
|
||||
filter.execute();
|
||||
|
||||
// Check for errors
|
||||
const char* errorMessage;
|
||||
if (device.getError(errorMessage) != oidn::Error::None) {
|
||||
std::cerr << "Error: " << errorMessage << std::endl;
|
||||
}
|
||||
}
|
||||
|
|
@ -58,7 +58,7 @@ void Editor::loadDefaults() {
|
|||
|
||||
void Editor::setViewportSize(const Vec2F& size) {
|
||||
// TODO remove
|
||||
// mScene.mCamera.rotate(0.01f, 0.0);
|
||||
mScene.mCamera.rotate(0.01f, 0.0);
|
||||
|
||||
mScene.mRenderSettings.size = size;
|
||||
|
||||
|
|
@ -72,25 +72,29 @@ Editor::~Editor() {
|
|||
|
||||
void Editor::renderPathFrame() {
|
||||
mPathRenderer.render(mScene, mPathTracerBuffers, mScene.mRenderSettings);
|
||||
// mPathTracerBuffers.color.flipY();
|
||||
sendBuffersToGPU();
|
||||
}
|
||||
|
||||
{
|
||||
glBindTexture(GL_TEXTURE_2D, mPathRenderTexture);
|
||||
const auto size = mPathTracerBuffers.color.size();
|
||||
glTexImage2D(
|
||||
GL_TEXTURE_2D,
|
||||
0,
|
||||
GL_RGBA32F,
|
||||
(GLsizei) size.x,
|
||||
(GLsizei) size.y,
|
||||
0,
|
||||
GL_RGBA,
|
||||
GL_FLOAT,
|
||||
mPathTracerBuffers.color.getBuff()
|
||||
);
|
||||
glBindTexture(GL_TEXTURE_2D, 0);
|
||||
void Editor::sendBuffersToGPU() {
|
||||
glBindTexture(GL_TEXTURE_2D, mPathRenderTexture);
|
||||
const auto size = mPathTracerBuffers.color.size();
|
||||
glTexImage2D(
|
||||
GL_TEXTURE_2D,
|
||||
0,
|
||||
GL_RGBA32F,
|
||||
(GLsizei) size.x,
|
||||
(GLsizei) size.y,
|
||||
0,
|
||||
GL_RGBA,
|
||||
GL_FLOAT,
|
||||
mPathTracerBuffers.color.getBuff()
|
||||
);
|
||||
glBindTexture(GL_TEXTURE_2D, 0);
|
||||
}
|
||||
|
||||
}
|
||||
void Editor::denoisePathRenderBuffers() {
|
||||
denoise();
|
||||
sendBuffersToGPU();
|
||||
}
|
||||
|
||||
void Editor::setRenderType(Editor::RenderType type) {
|
||||
|
|
|
|||
|
|
@ -21,6 +21,11 @@ namespace tp {
|
|||
|
||||
void renderPathFrame();
|
||||
void setRenderType(RenderType type);
|
||||
void denoisePathRenderBuffers();
|
||||
|
||||
private:
|
||||
void sendBuffersToGPU();
|
||||
void denoise();
|
||||
|
||||
private:
|
||||
Scene mScene;
|
||||
|
|
|
|||
|
|
@ -47,9 +47,11 @@ namespace tp {
|
|||
|
||||
mRenderPathTracer.mLabel.mLabel = "Render with Path Tracer";
|
||||
mRenderRaster.mLabel.mLabel = "Render with Raster";
|
||||
mDenoiseButton.mLabel.mLabel = "Denoise (IntelOpenImage)";
|
||||
|
||||
mSettingsWidget.addWidget(&mRenderPathTracer);
|
||||
mSettingsWidget.addWidget(&mRenderRaster);
|
||||
mSettingsWidget.addWidget(&mDenoiseButton);
|
||||
}
|
||||
|
||||
void eventProcess(const Events& events) override {
|
||||
|
|
@ -66,6 +68,10 @@ namespace tp {
|
|||
if (mRenderRaster.isFired()) {
|
||||
mEditor->setRenderType(Editor::RenderType::RASTER);
|
||||
}
|
||||
|
||||
if (mDenoiseButton.isFired()) {
|
||||
mEditor->denoisePathRenderBuffers();
|
||||
}
|
||||
}
|
||||
|
||||
void eventDraw(Canvas& canvas) override {
|
||||
|
|
@ -88,6 +94,7 @@ namespace tp {
|
|||
ScrollableWindow<Events, Canvas> mSettingsWidget;
|
||||
ButtonWidget<Events, Canvas> mRenderPathTracer;
|
||||
ButtonWidget<Events, Canvas> mRenderRaster;
|
||||
ButtonWidget<Events, Canvas> mDenoiseButton;
|
||||
|
||||
RGBA mBaseColor;
|
||||
};
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue