This commit is contained in:
IlyaShurupov 2024-06-19 12:28:30 +03:00 committed by Ilya Shurupov
parent 351a5d842e
commit 8b54ca0216
10 changed files with 87 additions and 20 deletions

View file

@ -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.

View file

@ -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")

View 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;
}
}

View file

@ -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) {

View file

@ -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;

View file

@ -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;
}; };

View file

@ -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)

View file

@ -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;
} }

View file

@ -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 -------------------------- ###

View file

@ -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 {