Spaces:
Running
on
Zero
Running
on
Zero
/* | |
* Copyright (C) 2020, Inria | |
* GRAPHDECO research group, https://team.inria.fr/graphdeco | |
* All rights reserved. | |
* | |
* This software is free for non-commercial, research and evaluation use | |
* under the terms of the LICENSE.md file. | |
* | |
* For inquiries contact [email protected] and/or [email protected] | |
*/ | |
namespace sibr { | |
ULRRenderer::ULRRenderer(const uint w, const uint h) | |
{ | |
std::cerr << "\n[ULRenderer] initializing" << std::endl; | |
std::cerr << "\n[ULRenderer] loading shaders" << std::endl; | |
_ulrShaderPass1 .init("ULR1", | |
sibr::loadFile(sibr::getShadersDirectory("ulr") + "/ulr.vert"), | |
sibr::loadFile(sibr::getShadersDirectory("ulr") + "/ulr1.frag")); | |
_ulrShaderPass2 .init("ULR2", | |
sibr::loadFile(sibr::getShadersDirectory("ulr") + "/ulr.vert"), | |
sibr::loadFile(sibr::getShadersDirectory("ulr") + "/ulr2.frag")); | |
_depthShader.init("Depth", | |
sibr::loadFile(sibr::getShadersDirectory("ulr") + "/ulr_intersect.vert"), | |
sibr::loadFile(sibr::getShadersDirectory("ulr") + "/ulr_intersect.frag")); | |
_ulrShaderPass1_nCamPos .init(_ulrShaderPass1, "nCamPos"); | |
_ulrShaderPass1_iCamPos .init(_ulrShaderPass1, "iCamPos"); | |
_ulrShaderPass1_iCamDir .init(_ulrShaderPass1, "iCamDir"); | |
_ulrShaderPass1_iCamProj.init(_ulrShaderPass1, "iCamProj"); | |
_ulrShaderPass1_occlTest .init(_ulrShaderPass1, "occlTest"); | |
_ulrShaderPass1_masking .init(_ulrShaderPass1, "doMasking"); | |
_depthShader_proj.init(_depthShader,"proj"); | |
std::cerr << "\n[ULRenderer] creating render targets" << std::endl; | |
_ulr0_RT .reset(new sibr::RenderTargetRGBA32F(w,h,0,4)); | |
_ulr1_RT .reset(new sibr::RenderTargetRGBA32F(w,h,0,4)); | |
_depth_RT.reset(new sibr::RenderTargetRGBA32F(w,h)); | |
_doOccl = true; | |
} | |
void | |
ULRRenderer::process(std::vector<uint>& imgs_ulr, const sibr::Camera& eye, | |
const sibr::BasicIBRScene::Ptr scene, | |
std::shared_ptr<sibr::Mesh>& altMesh, | |
const std::vector<std::shared_ptr<RenderTargetRGBA32F> >& inputRTs, | |
IRenderTarget& dst) | |
{ | |
// Get a new camera with z_near ~ 0 | |
sibr::Camera new_cam = eye; | |
new_cam.znear( 0.001f ); | |
// render geometry to depth map | |
glViewport(0,0, _depth_RT->w(), _depth_RT->h()); | |
_depth_RT->clear(); | |
_depth_RT->bind(); | |
_depthShader.begin(); | |
_depthShader_proj.set(new_cam.viewproj()); | |
glClear(GL_DEPTH_BUFFER_BIT); | |
if( altMesh != nullptr ) | |
altMesh->render( true, true); // enable depth test - disable back culling | |
else | |
scene->proxies()->proxy().render( true, true); // enable depth test - disable back culling | |
_depthShader.end(); | |
_depth_RT->unbind(); | |
// ULR pass 1 | |
_ulr0_RT->clear(sibr::Vector4f(0,0,0,1e5)); | |
_ulr1_RT->clear(sibr::Vector4f(0,0,0,1e5)); | |
for (uint i=0; i<imgs_ulr.size(); i++) { | |
if (scene->cameras()->inputCameras()[imgs_ulr[i]]->isActive()) { | |
const sibr::InputCamera& cam = *scene->cameras()->inputCameras()[imgs_ulr[i]]; | |
std::swap(_ulr0_RT, _ulr1_RT); | |
_ulrShaderPass1.begin(); | |
_ulr0_RT->bind(); | |
glViewport(0,0, _ulr0_RT->w(), _ulr0_RT->h()); | |
glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, inputRTs[imgs_ulr[i]]->texture()); | |
glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, _depth_RT->texture()); | |
glActiveTexture(GL_TEXTURE2); glBindTexture(GL_TEXTURE_2D, _ulr1_RT->texture(0)); | |
glActiveTexture(GL_TEXTURE3); glBindTexture(GL_TEXTURE_2D, _ulr1_RT->texture(1)); | |
glActiveTexture(GL_TEXTURE4); glBindTexture(GL_TEXTURE_2D, _ulr1_RT->texture(2)); | |
glActiveTexture(GL_TEXTURE5); glBindTexture(GL_TEXTURE_2D, _ulr1_RT->texture(3)); | |
if (useMasks()){ | |
glActiveTexture(GL_TEXTURE6); | |
glBindTexture(GL_TEXTURE_2D, getMasks()[imgs_ulr[i]]->texture()); | |
} | |
_ulrShaderPass1_masking.set(useMasks()); | |
_ulrShaderPass1_nCamPos.set(eye.position()); | |
_ulrShaderPass1_iCamPos.set(cam.position()); | |
_ulrShaderPass1_iCamDir.set(cam.dir()); | |
_ulrShaderPass1_iCamProj.set(cam.viewproj()); | |
_ulrShaderPass1_occlTest.set(_doOccl); | |
sibr::RenderUtility::renderScreenQuad(); | |
_ulr0_RT->unbind(); | |
_ulrShaderPass1.end(); | |
{ | |
sibr::ImageRGBA32F img2; | |
_ulr0_RT->readBack(img2); | |
show(img2); // DEBUG | |
} | |
} | |
} | |
// ULR pass 2 | |
// enable depth test to ensure depth of proxy is written to | |
// depth buffer by the shader | |
// glEnable(GL_DEPTH_TEST); /// \todo TODO -- breaks with fences -- check | |
_ulrShaderPass2.begin(); | |
dst.clear(); | |
dst.bind(); | |
glViewport(0,0, dst.w(), dst.h()); | |
glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, _depth_RT->texture()); | |
glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, _ulr0_RT->texture(0)); | |
glActiveTexture(GL_TEXTURE2); glBindTexture(GL_TEXTURE_2D, _ulr0_RT->texture(1)); | |
glActiveTexture(GL_TEXTURE3); glBindTexture(GL_TEXTURE_2D, _ulr0_RT->texture(2)); | |
glActiveTexture(GL_TEXTURE4); glBindTexture(GL_TEXTURE_2D, _ulr0_RT->texture(3)); | |
sibr::RenderUtility::renderScreenQuad(); | |
dst.unbind(); | |
_ulrShaderPass2.end(); | |
sibr::ImageRGB img; | |
dst.readBack(img); | |
show(img); // DEBUG | |
} | |
} /*namespace sibr*/ | |