#pragma once
#include <oidn.h>
#include <iostream>
#pragma comment(lib, "OpenImageDenoise.lib")
#pragma comment(lib, "OpenImageDenoise_core.lib")
OIDNFilter filter;
OIDNDevice device = oidnNewDevice(OIDN_DEVICE_TYPE_DEFAULT); // CPU or GPU if available
OIDNBuffer colorBuf, albedoBuf, normalBuf;
extern "C" __declspec(dllexport) void Init(int width, int height)
{
oidnCommitDevice(device);
colorBuf = oidnNewBuffer(device, width * height * 3 * sizeof(float));
albedoBuf = oidnNewBuffer(device, width * height * 3 * sizeof(float));
normalBuf = oidnNewBuffer(device, width * height * 3 * sizeof(float));
filter = oidnNewFilter(device, "RT");
oidnSetFilterImage(filter, "color", colorBuf,
OIDN_FORMAT_FLOAT3, width, height, 0, 0, 0); // beauty
oidnSetFilterImage(filter, "albedo", albedoBuf,
OIDN_FORMAT_FLOAT3, width, height, 0, 0, 0); // auxiliary
oidnSetFilterImage(filter, "normal", normalBuf,
OIDN_FORMAT_FLOAT3, width, height, 0, 0, 0); // auxiliary
oidnSetFilterImage(filter, "output", colorBuf,
OIDN_FORMAT_FLOAT3, width, height, 0, 0, 0); // denoised beauty
oidnSetFilterBool(filter, "hdr", true); // beauty image is HDR
oidnCommitFilter(filter);
}
extern "C" __declspec(dllexport) void Denoise(float* color, float* albedo, float* normal, int width, int height)
{
//拷贝color、albedo、normal到oidn缓存
oidnWriteBuffer(colorBuf, 0, width * height * 3 * sizeof(float), color);
oidnWriteBuffer(albedoBuf, 0, width * height * 3 * sizeof(float), albedo);
oidnWriteBuffer(normalBuf, 0, width * height * 3 * sizeof(float), normal);
//执行降噪
oidnExecuteFilter(filter);
//将降噪结果拷贝到color数组
oidnReadBuffer(colorBuf, 0, width * height * 3 * sizeof(float), color);
}
Intel® Open Image Denoise c++
于 2024-07-25 17:33:23 首次发布