add oidn
This commit is contained in:
parent
351a5d842e
commit
8b54ca0216
10 changed files with 87 additions and 20 deletions
1
.github/workflows/cmake-single-platform.yml
vendored
1
.github/workflows/cmake-single-platform.yml
vendored
|
|
@ -32,6 +32,7 @@ jobs:
|
||||||
sudo apt-get install -y libasound2-dev libglew-dev
|
sudo apt-get install -y libasound2-dev libglew-dev
|
||||||
sudo apt-get install -y portaudio19-dev
|
sudo apt-get install -y portaudio19-dev
|
||||||
sudo apt-get install -y libwayland-dev libxkbcommon-dev
|
sudo apt-get install -y libwayland-dev libxkbcommon-dev
|
||||||
|
sudo apt-get install -y openimagedenoise
|
||||||
|
|
||||||
- name: Configure CMake
|
- name: Configure CMake
|
||||||
# Configure CMake in a 'build' subdirectory. `CMAKE_BUILD_TYPE` is only required if you are using a single-configuration generator such as make.
|
# Configure CMake in a 'build' subdirectory. `CMAKE_BUILD_TYPE` is only required if you are using a single-configuration generator such as make.
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,8 @@ add_library(${PROJECT_NAME} STATIC ${SOURCES} ${HEADERS})
|
||||||
|
|
||||||
target_include_directories(${PROJECT_NAME} PUBLIC ./public/ ${BINDINGS_INCLUDE} ./ext/)
|
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 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 -------------------------- ###
|
### -------------------------- Applications -------------------------- ###
|
||||||
file(GLOB APP_SOURCES "./applications/*.cpp")
|
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) {
|
void Editor::setViewportSize(const Vec2F& size) {
|
||||||
// TODO remove
|
// TODO remove
|
||||||
// mScene.mCamera.rotate(0.01f, 0.0);
|
mScene.mCamera.rotate(0.01f, 0.0);
|
||||||
|
|
||||||
mScene.mRenderSettings.size = size;
|
mScene.mRenderSettings.size = size;
|
||||||
|
|
||||||
|
|
@ -72,9 +72,10 @@ Editor::~Editor() {
|
||||||
|
|
||||||
void Editor::renderPathFrame() {
|
void Editor::renderPathFrame() {
|
||||||
mPathRenderer.render(mScene, mPathTracerBuffers, mScene.mRenderSettings);
|
mPathRenderer.render(mScene, mPathTracerBuffers, mScene.mRenderSettings);
|
||||||
// mPathTracerBuffers.color.flipY();
|
sendBuffersToGPU();
|
||||||
|
}
|
||||||
|
|
||||||
{
|
void Editor::sendBuffersToGPU() {
|
||||||
glBindTexture(GL_TEXTURE_2D, mPathRenderTexture);
|
glBindTexture(GL_TEXTURE_2D, mPathRenderTexture);
|
||||||
const auto size = mPathTracerBuffers.color.size();
|
const auto size = mPathTracerBuffers.color.size();
|
||||||
glTexImage2D(
|
glTexImage2D(
|
||||||
|
|
@ -89,8 +90,11 @@ void Editor::renderPathFrame() {
|
||||||
mPathTracerBuffers.color.getBuff()
|
mPathTracerBuffers.color.getBuff()
|
||||||
);
|
);
|
||||||
glBindTexture(GL_TEXTURE_2D, 0);
|
glBindTexture(GL_TEXTURE_2D, 0);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
void Editor::denoisePathRenderBuffers() {
|
||||||
|
denoise();
|
||||||
|
sendBuffersToGPU();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Editor::setRenderType(Editor::RenderType type) {
|
void Editor::setRenderType(Editor::RenderType type) {
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,11 @@ namespace tp {
|
||||||
|
|
||||||
void renderPathFrame();
|
void renderPathFrame();
|
||||||
void setRenderType(RenderType type);
|
void setRenderType(RenderType type);
|
||||||
|
void denoisePathRenderBuffers();
|
||||||
|
|
||||||
|
private:
|
||||||
|
void sendBuffersToGPU();
|
||||||
|
void denoise();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Scene mScene;
|
Scene mScene;
|
||||||
|
|
|
||||||
|
|
@ -47,9 +47,11 @@ namespace tp {
|
||||||
|
|
||||||
mRenderPathTracer.mLabel.mLabel = "Render with Path Tracer";
|
mRenderPathTracer.mLabel.mLabel = "Render with Path Tracer";
|
||||||
mRenderRaster.mLabel.mLabel = "Render with Raster";
|
mRenderRaster.mLabel.mLabel = "Render with Raster";
|
||||||
|
mDenoiseButton.mLabel.mLabel = "Denoise (IntelOpenImage)";
|
||||||
|
|
||||||
mSettingsWidget.addWidget(&mRenderPathTracer);
|
mSettingsWidget.addWidget(&mRenderPathTracer);
|
||||||
mSettingsWidget.addWidget(&mRenderRaster);
|
mSettingsWidget.addWidget(&mRenderRaster);
|
||||||
|
mSettingsWidget.addWidget(&mDenoiseButton);
|
||||||
}
|
}
|
||||||
|
|
||||||
void eventProcess(const Events& events) override {
|
void eventProcess(const Events& events) override {
|
||||||
|
|
@ -66,6 +68,10 @@ namespace tp {
|
||||||
if (mRenderRaster.isFired()) {
|
if (mRenderRaster.isFired()) {
|
||||||
mEditor->setRenderType(Editor::RenderType::RASTER);
|
mEditor->setRenderType(Editor::RenderType::RASTER);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (mDenoiseButton.isFired()) {
|
||||||
|
mEditor->denoisePathRenderBuffers();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void eventDraw(Canvas& canvas) override {
|
void eventDraw(Canvas& canvas) override {
|
||||||
|
|
@ -88,6 +94,7 @@ namespace tp {
|
||||||
ScrollableWindow<Events, Canvas> mSettingsWidget;
|
ScrollableWindow<Events, Canvas> mSettingsWidget;
|
||||||
ButtonWidget<Events, Canvas> mRenderPathTracer;
|
ButtonWidget<Events, Canvas> mRenderPathTracer;
|
||||||
ButtonWidget<Events, Canvas> mRenderRaster;
|
ButtonWidget<Events, Canvas> mRenderRaster;
|
||||||
|
ButtonWidget<Events, Canvas> mDenoiseButton;
|
||||||
|
|
||||||
RGBA mBaseColor;
|
RGBA mBaseColor;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
6
Externals/CMakeLists.txt
vendored
6
Externals/CMakeLists.txt
vendored
|
|
@ -85,3 +85,9 @@ set_target_properties(${PROJECT_NAME} PROPERTIES
|
||||||
project(ImageIO)
|
project(ImageIO)
|
||||||
add_library(${PROJECT_NAME} INTERFACE)
|
add_library(${PROJECT_NAME} INTERFACE)
|
||||||
target_include_directories(${PROJECT_NAME} INTERFACE ./imageIO/)
|
target_include_directories(${PROJECT_NAME} INTERFACE ./imageIO/)
|
||||||
|
|
||||||
|
|
||||||
|
#set(OIDN_DEVICE_CPU ON)
|
||||||
|
#set(OIDN_STATIC_LIB ON)
|
||||||
|
#add_subdirectory(oidn)
|
||||||
|
find_package(OpenImageDenoise REQUIRED)
|
||||||
|
|
|
||||||
|
|
@ -39,7 +39,7 @@ bool TrigCache::castRay(const Ray& ray) const {
|
||||||
static halnf a, f, u, v;
|
static halnf a, f, u, v;
|
||||||
static halnf t;
|
static halnf t;
|
||||||
|
|
||||||
if (ray.dir.dot(mNormal) > 0) {
|
if (ray.dir.dot(mNormal) > 0 && 0) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@ file(GLOB SOURCES "./private/*.cpp" "./private/*/*.cpp")
|
||||||
file(GLOB HEADERS "./public/*.hpp" "./public/*/*.hpp" "./applications/*.hpp")
|
file(GLOB HEADERS "./public/*.hpp" "./public/*/*.hpp" "./applications/*.hpp")
|
||||||
add_library(${PROJECT_NAME} STATIC ${SOURCES} ${HEADERS})
|
add_library(${PROJECT_NAME} STATIC ${SOURCES} ${HEADERS})
|
||||||
target_include_directories(${PROJECT_NAME} PUBLIC ./public/)
|
target_include_directories(${PROJECT_NAME} PUBLIC ./public/)
|
||||||
|
|
||||||
target_link_libraries(${PROJECT_NAME} PUBLIC 3DScene Connection)
|
target_link_libraries(${PROJECT_NAME} PUBLIC 3DScene Connection)
|
||||||
|
|
||||||
### -------------------------- Applications -------------------------- ###
|
### -------------------------- Applications -------------------------- ###
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,7 @@ namespace tp {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
RayTracer() = default;
|
RayTracer() = default;
|
||||||
|
|
||||||
void render(const Scene& scene, OutputBuffers& out, const RenderSettings& settings);
|
void render(const Scene& scene, OutputBuffers& out, const RenderSettings& settings);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
@ -34,6 +35,7 @@ namespace tp {
|
||||||
TrigCache* trig = nullptr;
|
TrigCache* trig = nullptr;
|
||||||
Vec3F hitPos = { 0, 0, 0 };
|
Vec3F hitPos = { 0, 0, 0 };
|
||||||
bool hit = false;
|
bool hit = false;
|
||||||
|
bool inv = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct LightData {
|
struct LightData {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue