如何解决实时 GPU 路径追踪,使用 OIDN英特尔开放图像降噪降噪
我正在试验路径追踪和去噪。我正在尝试实时实现无噪声图像。路径跟踪器本身在 GPU (OpenGL/GLSL) 上运行。我决定尝试使用OIDN去噪器,但是遇到了去噪器只在CPU上运行的问题,不明白如何切换到GPU。这甚至可能吗?
这就是我初始化降噪器的方式
// Init device
g_denoiserDevice = oidnNewDevice(OIDN_DEVICE_TYPE_DEFAULT);
oidnCommitDevice(g_denoiserDevice);
// Calculate size
unsigned frameSizeBytes = 4 * 3 * width * height;
// Create buffers
g_denoiserBufferColor = oidnNewBuffer(g_denoiserDevice,frameSizeBytes);
g_denoiserBufferAlbedo = oidnNewBuffer(g_denoiserDevice,frameSizeBytes);
g_denoiserBufferNormal = oidnNewBuffer(g_denoiserDevice,frameSizeBytes);
g_denoiserBufferResult = oidnNewBuffer(g_denoiserDevice,frameSizeBytes);
// Create filter
g_denoiserFilter = oidnNewFilter(g_denoiserDevice,"RT");
oidnSetFilterImage(g_denoiserFilter,"color",g_denoiserBufferColor,OIDN_FORMAT_FLOAT3,width,height,0);
oidnSetFilterImage(g_denoiserFilter,"albedo",g_denoiserBufferAlbedo,"normal",g_denoiserBufferNormal,"output",g_denoiserBufferResult,0);
oidnSetFilter1b(g_denoiserFilter,"hdr",false);
oidnCommitFilter(g_denoiserFilter);
// Create OpenGL texture for denoiser output
g_denoisedFrameTexture = new gl::Texture2D(nullptr,gl::Texture2D::ColorSpace::eRgb,gl::Texture2D::eBilinear,false,GL_FLOAT);
这就是我使用降噪器的方式
// Calculate size
unsigned frameSizeBytes = 4 * 3 * frameBufferPtr->getWidth() * frameBufferPtr->getHeight();
// Map input image buffers
void* colorBufferPtr = oidnMapBuffer(g_denoiserBufferColor,OIDN_ACCESS_READ_WRITE,frameSizeBytes);
void* normalBufferPtr = oidnMapBuffer(g_denoiserBufferNormal,frameSizeBytes);
void* albedoBufferPtr = oidnMapBuffer(g_denoiserBufferAlbedo,frameSizeBytes);
// Bind framebuffer
glBindFramebuffer(GL_FRAMEBUFFER,frameBufferPtr->getId());
// Copy data from framebuffer attachments to denoiser buffers
glReadBuffer(GL_COLOR_ATTACHMENT0);
glReadPixels(0,frameBufferPtr->getWidth(),frameBufferPtr->getHeight(),GL_RGB,GL_FLOAT,colorBufferPtr);
glReadBuffer(GL_COLOR_ATTACHMENT1);
glReadPixels(0,normalBufferPtr);
glReadBuffer(GL_COLOR_ATTACHMENT2);
glReadPixels(0,albedoBufferPtr);
// Unmap input image buffers
oidnUnmapBuffer(g_denoiserBufferColor,colorBufferPtr);
oidnUnmapBuffer(g_denoiserBufferNormal,normalBufferPtr);
oidnUnmapBuffer(g_denoiserBufferAlbedo,albedoBufferPtr);
// Denoise
oidnExecuteFilter(g_denoiserFilter);
// Map output image buffer
void* resultBufferPtr = oidnMapBuffer(g_denoiserBufferResult,frameSizeBytes);
// Copy to texture
g_denoisedFrameTexture->setTextureData(resultBufferPtr,GL_RGB32F,GL_FLOAT);
// Unmap
oidnUnmapBuffer(g_denoiserBufferResult,resultBufferPtr);
这是我得到的
如您所见,降噪器非常慢。我尝试将 OIDN_DEVICE_TYPE_DEFAULT 更改为 OIDN_DEVICE_TYPE_CPU,但没有任何改变。看起来无论如何都在使用CPU。还有关于质量的问题,但那是以后的事了。
我没有从源代码构建 OIDN,只是采用了 Windows 的预编译二进制文件。 甚至可以使用 OIDN 进行实时路径跟踪吗?如果是这样,如何?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。