diff --git a/.github/workflows/cmake-single-platform.yml b/.github/workflows/cmake-single-platform.yml index d7b4c18..595ba0c 100644 --- a/.github/workflows/cmake-single-platform.yml +++ b/.github/workflows/cmake-single-platform.yml @@ -32,6 +32,7 @@ jobs: sudo apt-get install -y libasound2-dev libglew-dev sudo apt-get install -y portaudio19-dev sudo apt-get install -y libwayland-dev libxkbcommon-dev + sudo apt-get install -y openimagedenoise - 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. diff --git a/3DEditor/CMakeLists.txt b/3DEditor/CMakeLists.txt index 909fa6d..356210b 100644 --- a/3DEditor/CMakeLists.txt +++ b/3DEditor/CMakeLists.txt @@ -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") diff --git a/3DEditor/private/Denoise.cpp b/3DEditor/private/Denoise.cpp new file mode 100644 index 0000000..7c4955a --- /dev/null +++ b/3DEditor/private/Denoise.cpp @@ -0,0 +1,40 @@ + +#include "Editor.hpp" + +#include "OpenImageDenoise/oidn.hpp" +#include + +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; + } +} \ No newline at end of file diff --git a/3DEditor/private/Editor.cpp b/3DEditor/private/Editor.cpp index 6406a9c..5fc2931 100644 --- a/3DEditor/private/Editor.cpp +++ b/3DEditor/private/Editor.cpp @@ -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) { diff --git a/3DEditor/public/Editor.hpp b/3DEditor/public/Editor.hpp index f907051..9e4d40b 100644 --- a/3DEditor/public/Editor.hpp +++ b/3DEditor/public/Editor.hpp @@ -21,6 +21,11 @@ namespace tp { void renderPathFrame(); void setRenderType(RenderType type); + void denoisePathRenderBuffers(); + + private: + void sendBuffersToGPU(); + void denoise(); private: Scene mScene; diff --git a/3DEditor/public/EditorWidget.hpp b/3DEditor/public/EditorWidget.hpp index 55cd39f..13eed21 100644 --- a/3DEditor/public/EditorWidget.hpp +++ b/3DEditor/public/EditorWidget.hpp @@ -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 mSettingsWidget; ButtonWidget mRenderPathTracer; ButtonWidget mRenderRaster; + ButtonWidget mDenoiseButton; RGBA mBaseColor; }; diff --git a/Externals/CMakeLists.txt b/Externals/CMakeLists.txt index d1801ac..70947cd 100644 --- a/Externals/CMakeLists.txt +++ b/Externals/CMakeLists.txt @@ -85,3 +85,9 @@ set_target_properties(${PROJECT_NAME} PROPERTIES project(ImageIO) add_library(${PROJECT_NAME} INTERFACE) target_include_directories(${PROJECT_NAME} INTERFACE ./imageIO/) + + +#set(OIDN_DEVICE_CPU ON) +#set(OIDN_STATIC_LIB ON) +#add_subdirectory(oidn) +find_package(OpenImageDenoise REQUIRED) diff --git a/Math/private/Topology.cpp b/Math/private/Topology.cpp index 7ce89df..90583c2 100644 --- a/Math/private/Topology.cpp +++ b/Math/private/Topology.cpp @@ -39,7 +39,7 @@ bool TrigCache::castRay(const Ray& ray) const { static halnf a, f, u, v; static halnf t; - if (ray.dir.dot(mNormal) > 0) { + if (ray.dir.dot(mNormal) > 0 && 0) { return false; } diff --git a/RayTracer/CMakeLists.txt b/RayTracer/CMakeLists.txt index 5e4d34d..1893d37 100644 --- a/RayTracer/CMakeLists.txt +++ b/RayTracer/CMakeLists.txt @@ -5,6 +5,7 @@ file(GLOB SOURCES "./private/*.cpp" "./private/*/*.cpp") file(GLOB HEADERS "./public/*.hpp" "./public/*/*.hpp" "./applications/*.hpp") add_library(${PROJECT_NAME} STATIC ${SOURCES} ${HEADERS}) target_include_directories(${PROJECT_NAME} PUBLIC ./public/) + target_link_libraries(${PROJECT_NAME} PUBLIC 3DScene Connection) ### -------------------------- Applications -------------------------- ### diff --git a/RayTracer/public/RayTracer.hpp b/RayTracer/public/RayTracer.hpp index 76680c0..4067247 100644 --- a/RayTracer/public/RayTracer.hpp +++ b/RayTracer/public/RayTracer.hpp @@ -26,6 +26,7 @@ namespace tp { public: RayTracer() = default; + void render(const Scene& scene, OutputBuffers& out, const RenderSettings& settings); private: @@ -34,6 +35,7 @@ namespace tp { TrigCache* trig = nullptr; Vec3F hitPos = { 0, 0, 0 }; bool hit = false; + bool inv = false; }; struct LightData {