Skip to content

Commit

Permalink
Implement lazy-generation of the environment preconvolution
Browse files Browse the repository at this point in the history
  • Loading branch information
ApoorvaJ committed Sep 18, 2023
1 parent 5cd4526 commit aaeb75c
Show file tree
Hide file tree
Showing 6 changed files with 23 additions and 16 deletions.
1 change: 0 additions & 1 deletion source/MaterialXView/RenderPipeline.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,6 @@ class RenderPipeline
virtual void bakeTextures() = 0;

virtual void updateAlbedoTable(int tableSize) = 0;
virtual mx::ImagePtr convolveEnvironment() = 0;
virtual std::shared_ptr<void> createTextureBaker(unsigned int width,
unsigned int height,
mx::Image::BaseType baseType) = 0;
Expand Down
5 changes: 2 additions & 3 deletions source/MaterialXView/RenderPipelineGL.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ void GLRenderPipeline::updateAlbedoTable(int tableSize)
glDrawBuffer(GL_BACK);
}

mx::ImagePtr GLRenderPipeline::convolveEnvironment()
void GLRenderPipeline::convolveEnvironment()
{
auto& genContext = _viewer->_genContext;
auto& lightHandler = _viewer->_lightHandler;
Expand All @@ -128,7 +128,6 @@ mx::ImagePtr GLRenderPipeline::convolveEnvironment()
catch (std::exception& e)
{
new ng::MessageDialog(_viewer, ng::MessageDialog::Type::Warning, "Failed to generate convolution shader", e.what());
return nullptr;
}

mx::ImagePtr srcTex = lightHandler->getEnvRadianceMap();
Expand Down Expand Up @@ -182,7 +181,7 @@ mx::ImagePtr GLRenderPipeline::convolveEnvironment()
glViewport(0, 0, _viewer->m_fbsize[0], _viewer->m_fbsize[1]);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);

return outTex;
lightHandler->setEnvRadianceMapPreConvolved(outTex);
}

mx::ImagePtr GLRenderPipeline::getShadowMap(int shadowMapSize)
Expand Down
2 changes: 1 addition & 1 deletion source/MaterialXView/RenderPipelineGL.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@ class GLRenderPipeline : public RenderPipeline
mx::ImageHandlerPtr createImageHandler() override;
mx::MaterialPtr createMaterial() override;
void updateAlbedoTable(int tableSize) override;
mx::ImagePtr convolveEnvironment() override;
std::shared_ptr<void> createTextureBaker(unsigned int width,
unsigned int height,
mx::Image::BaseType baseType) override;
Expand All @@ -44,6 +43,7 @@ class GLRenderPipeline : public RenderPipeline

protected:
mx::ImagePtr getShadowMap(int shadowMapSize) override;
void convolveEnvironment();
};

#endif // RENDER_PIPELINE_GL_H
3 changes: 2 additions & 1 deletion source/MaterialXView/RenderPipelineMetal.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,6 @@ class MetalRenderPipeline : public RenderPipeline
mx::ImageHandlerPtr createImageHandler() override;
mx::MaterialPtr createMaterial() override;
void updateAlbedoTable(int tableSize) override;
mx::ImagePtr convolveEnvironment() override;
void renderFrame(void* color_texture, int shadowMapSize, const char* dirLightNodeCat) override;
void bakeTextures() override;
mx::ImagePtr getFrameImage() override;
Expand All @@ -51,7 +50,9 @@ class MetalRenderPipeline : public RenderPipeline
protected:
mx::ImagePtr getShadowMap(int shadowMapSize) override;
mx::MetalFramebufferPtr _shadowMapFramebuffer;
mx::MetalFramebufferPtr _preConvolutionFramebuffer;
mx::ImagePtr _shadowMap[SHADOWMAP_TEX_COUNT];
void convolveEnvironment();
};

#endif // RENDER_PIPELINE_METAL_H
24 changes: 16 additions & 8 deletions source/MaterialXView/RenderPipelineMetal.mm
Original file line number Diff line number Diff line change
Expand Up @@ -155,13 +155,18 @@
}
}

mx::ImagePtr MetalRenderPipeline::convolveEnvironment()
void MetalRenderPipeline::convolveEnvironment()
{
auto& genContext = _viewer->_genContext;
auto& lightHandler = _viewer->_lightHandler;
auto& imageHandler = _viewer->_imageHandler;
mx::MetalTextureHandlerPtr mtlImageHandler = std::dynamic_pointer_cast<mx::MetalTextureHandler>(imageHandler);

if (lightHandler->getEnvRadianceMapPreConvolved())
{
return;
}

mx::ImagePtr srcTex = lightHandler->getEnvRadianceMap();
int w = srcTex->getWidth();
int h = srcTex->getHeight();
Expand All @@ -172,15 +177,15 @@


// Create framebuffer.
mx::MetalFramebufferPtr framebuffer = mx::MetalFramebuffer::create(
_preConvolutionFramebuffer = mx::MetalFramebuffer::create(
MTL(device),
w, h,
4,
mx::Image::BaseType::UINT8, // TODO: Should this be HALF?
mx::Image::BaseType::HALF,
metalTex
);

MTL_PUSH_FRAMEBUFFER(framebuffer);
MTL_PUSH_FRAMEBUFFER(_preConvolutionFramebuffer);

int i = 0;

Expand All @@ -192,7 +197,7 @@
[desc.colorAttachments[0] setLevel:i];
[desc.colorAttachments[0] setLoadAction:MTLLoadActionDontCare];
[desc.colorAttachments[0] setStoreAction:MTLStoreActionStore];
[desc.depthAttachment setTexture:framebuffer->getDepthTexture()];
[desc.depthAttachment setTexture:_preConvolutionFramebuffer->getDepthTexture()];
[desc.depthAttachment setLoadAction:MTLLoadActionDontCare];
[desc.depthAttachment setStoreAction:MTLStoreActionDontCare];
[desc setStencilAttachment:nil];
Expand All @@ -211,10 +216,9 @@
catch (std::exception& e)
{
new ng::MessageDialog(_viewer, ng::MessageDialog::Type::Warning, "Failed to generate convolution shader", e.what());
return nullptr;
}

framebuffer->bind(desc);
_preConvolutionFramebuffer->bind(desc);
material->bindShader();
material->getProgram()->bindUniform(mx::HW::CONVOLUTION_MIP_LEVEL, mx::Value::createValue(i));

Expand All @@ -240,7 +244,7 @@

MTL_POP_FRAMEBUFFER();

return outTex;
lightHandler->setEnvRadianceMapPreConvolved(outTex);
}

mx::ImagePtr MetalRenderPipeline::getShadowMap(int shadowMapSize)
Expand Down Expand Up @@ -403,6 +407,10 @@
auto& searchPath = _viewer->_searchPath;
auto& geometryHandler = _viewer->_geometryHandler;

if (lightHandler->getUsePreConvolvedEnvLighting())
{
convolveEnvironment();
}
// Update lighting state.
lightHandler->setLightTransform(mx::Matrix44::createRotationY(lightRotation / 180.0f * M_PI));

Expand Down
4 changes: 2 additions & 2 deletions source/MaterialXView/Viewer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -505,11 +505,11 @@ void Viewer::loadEnvironmentLight()

// Release any existing environment maps and store the new ones.
_imageHandler->releaseRenderResources(_lightHandler->getEnvRadianceMap());
_lightHandler->setEnvRadianceMapPreConvolved(nullptr);
_imageHandler->releaseRenderResources(_lightHandler->getEnvRadianceMapPreConvolved());
_imageHandler->releaseRenderResources(_lightHandler->getEnvIrradianceMap());

_lightHandler->setEnvRadianceMap(envRadianceMap);
mx::ImagePtr preConvolvedEnvRadianceMap = _renderPipeline->convolveEnvironment();
_lightHandler->setEnvRadianceMapPreConvolved(preConvolvedEnvRadianceMap);
_lightHandler->setEnvIrradianceMap(envIrradianceMap);

// Look for a light rig using an expected filename convention.
Expand Down

0 comments on commit aaeb75c

Please sign in to comment.