diff --git a/include/polyscope/render_image_quantity_base.h b/include/polyscope/render_image_quantity_base.h index 649d99b9..4a2edddb 100644 --- a/include/polyscope/render_image_quantity_base.h +++ b/include/polyscope/render_image_quantity_base.h @@ -80,6 +80,7 @@ class RenderImageQuantityBase : public FloatingQuantity, public FullscreenArtist void prepareGeometryBuffers(); void addOptionsPopupEntries(); void preparePick(); + void setRenderImageUniforms(render::ShaderProgram& program, bool withTonemap = false); }; diff --git a/src/color_image_quantity.cpp b/src/color_image_quantity.cpp index c6f14565..f1c97f5d 100644 --- a/src/color_image_quantity.cpp +++ b/src/color_image_quantity.cpp @@ -87,7 +87,7 @@ void ColorImageQuantity::showFullscreen() { BlendMode::AlphaOver); // WARNING: I never really thought through this, may cause problems // Set uniforms - fullscreenProgram->setUniform("u_transparency", getTransparency()); + fullscreenProgram->setUniform("u_textureTransparency", getTransparency()); render::engine->setTonemapUniforms(*fullscreenProgram); fullscreenProgram->draw(); @@ -128,7 +128,7 @@ void ColorImageQuantity::showInBillboard(glm::vec3 center, glm::vec3 upVec, glm: // set uniforms parent.setStructureUniforms(*billboardProgram); - billboardProgram->setUniform("u_transparency", getTransparency()); + billboardProgram->setUniform("u_textureTransparency", getTransparency()); billboardProgram->setUniform("u_billboardCenter", center); billboardProgram->setUniform("u_billboardUp", upVec); billboardProgram->setUniform("u_billboardRight", rightVec); diff --git a/src/color_render_image_quantity.cpp b/src/color_render_image_quantity.cpp index 07874353..ed2013eb 100644 --- a/src/color_render_image_quantity.cpp +++ b/src/color_render_image_quantity.cpp @@ -27,15 +27,7 @@ void ColorRenderImageQuantity::drawDelayed() { if (!program) prepare(); - // set uniforms - glm::mat4 P = view::getCameraPerspectiveMatrix(); - glm::mat4 Pinv = glm::inverse(P); - - program->setUniform("u_projMatrix", glm::value_ptr(P)); - program->setUniform("u_invProjMatrix", glm::value_ptr(Pinv)); - program->setUniform("u_viewport", render::engine->getCurrentViewport()); - program->setUniform("u_transparency", transparency.get()); - render::engine->setMaterialUniforms(*program, material.get()); + setRenderImageUniforms(*program); // draw program->draw(); @@ -69,13 +61,13 @@ void ColorRenderImageQuantity::prepare() { // clang-format off program = render::engine->requestShader("TEXTURE_DRAW_RENDERIMAGE_PLAIN", render::engine->addMaterialRules(material.get(), - { + parent.addStructureRules({ getImageOriginRule(imageOrigin), hasNormals ? "SHADE_NORMAL_FROM_TEXTURE" : "SHADE_NORMAL_FROM_VIEWPOS_VAR", "TEXTURE_SHADE_COLOR" - } + }) ), - render::ShaderReplacementDefaults::Process); + render::ShaderReplacementDefaults::SceneObjectNoSlice); // clang-format on program->setAttribute("a_position", render::engine->screenTrianglesCoords()); diff --git a/src/depth_render_image_quantity.cpp b/src/depth_render_image_quantity.cpp index c2e44ab9..f6bdf1f0 100644 --- a/src/depth_render_image_quantity.cpp +++ b/src/depth_render_image_quantity.cpp @@ -23,15 +23,8 @@ void DepthRenderImageQuantity::drawDelayed() { if (!program) prepare(); - // set uniforms - glm::mat4 P = view::getCameraPerspectiveMatrix(); - glm::mat4 Pinv = glm::inverse(P); - - program->setUniform("u_projMatrix", glm::value_ptr(P)); - program->setUniform("u_invProjMatrix", glm::value_ptr(Pinv)); - program->setUniform("u_viewport", render::engine->getCurrentViewport()); + setRenderImageUniforms(*program); program->setUniform("u_baseColor", color.get()); - program->setUniform("u_transparency", transparency.get()); render::engine->setMaterialUniforms(*program, material.get()); // draw @@ -73,13 +66,13 @@ void DepthRenderImageQuantity::prepare() { // clang-format off program = render::engine->requestShader("TEXTURE_DRAW_RENDERIMAGE_PLAIN", render::engine->addMaterialRules(material.get(), - { + parent.addStructureRules({ getImageOriginRule(imageOrigin), hasNormals ? "SHADE_NORMAL_FROM_TEXTURE" : "SHADE_NORMAL_FROM_VIEWPOS_VAR", "SHADE_BASECOLOR", - } + }) ), - render::ShaderReplacementDefaults::Process); + render::ShaderReplacementDefaults::SceneObjectNoSlice); // clang-format on program->setAttribute("a_position", render::engine->screenTrianglesCoords()); diff --git a/src/polyscope.cpp b/src/polyscope.cpp index aa733d37..9d9b360e 100644 --- a/src/polyscope.cpp +++ b/src/polyscope.cpp @@ -606,10 +606,11 @@ void renderScene() { if (!isRedraw) { // Only on first pass (kinda weird, but works out, and doesn't really matter) renderSlicePlanes(); - render::engine->applyTransparencySettings(); - drawStructuresDelayed(); } + render::engine->applyTransparencySettings(); + drawStructuresDelayed(); + // Composite the result of this pass in to the result buffer render::engine->sceneBufferFinal->bind(); render::engine->setDepthMode(DepthMode::Disable); diff --git a/src/raw_color_alpha_render_image_quantity.cpp b/src/raw_color_alpha_render_image_quantity.cpp index d8d4c2ec..184dd6f9 100644 --- a/src/raw_color_alpha_render_image_quantity.cpp +++ b/src/raw_color_alpha_render_image_quantity.cpp @@ -28,16 +28,7 @@ void RawColorAlphaRenderImageQuantity::drawDelayed() { if (!program) prepare(); - // set uniforms - glm::mat4 P = view::getCameraPerspectiveMatrix(); - glm::mat4 Pinv = glm::inverse(P); - - program->setUniform("u_projMatrix", glm::value_ptr(P)); - program->setUniform("u_invProjMatrix", glm::value_ptr(Pinv)); - program->setUniform("u_viewport", render::engine->getCurrentViewport()); - program->setUniform("u_transparency", transparency.get()); - render::engine->setTonemapUniforms(*program); - + setRenderImageUniforms(*program, true); // draw program->draw(); @@ -72,10 +63,11 @@ void RawColorAlphaRenderImageQuantity::prepare() { // applied after compositing. // Create the sourceProgram - program = render::engine->requestShader("TEXTURE_DRAW_RAW_RENDERIMAGE_PLAIN", - {getImageOriginRule(imageOrigin), "TEXTURE_SHADE_COLORALPHA", - "INVERSE_TONEMAP", getIsPremultiplied() ? "" : "TEXTURE_PREMULTIPLY_OUT"}, - render::ShaderReplacementDefaults::Process); + program = render::engine->requestShader( + "TEXTURE_DRAW_RAW_RENDERIMAGE_PLAIN", + parent.addStructureRules({getImageOriginRule(imageOrigin), "TEXTURE_SHADE_COLORALPHA", "INVERSE_TONEMAP", + getIsPremultiplied() ? "" : "TEXTURE_PREMULTIPLY_OUT"}), + render::ShaderReplacementDefaults::SceneObjectNoSlice); program->setAttribute("a_position", render::engine->screenTrianglesCoords()); program->setTextureFromBuffer("t_depth", depths.getRenderTextureBuffer().get()); diff --git a/src/raw_color_render_image_quantity.cpp b/src/raw_color_render_image_quantity.cpp index f7a2c970..91425577 100644 --- a/src/raw_color_render_image_quantity.cpp +++ b/src/raw_color_render_image_quantity.cpp @@ -27,15 +27,7 @@ void RawColorRenderImageQuantity::drawDelayed() { if (!program) prepare(); - // set uniforms - glm::mat4 P = view::getCameraPerspectiveMatrix(); - glm::mat4 Pinv = glm::inverse(P); - - program->setUniform("u_projMatrix", glm::value_ptr(P)); - program->setUniform("u_invProjMatrix", glm::value_ptr(Pinv)); - program->setUniform("u_viewport", render::engine->getCurrentViewport()); - program->setUniform("u_transparency", transparency.get()); - render::engine->setTonemapUniforms(*program); + setRenderImageUniforms(*program, true); // draw program->draw(); @@ -66,10 +58,11 @@ void RawColorRenderImageQuantity::refresh() { void RawColorRenderImageQuantity::prepare() { // Create the sourceProgram - program = render::engine->requestShader( - "TEXTURE_DRAW_RAW_RENDERIMAGE_PLAIN", - {getImageOriginRule(imageOrigin), "TEXTURE_SHADE_COLOR", "INVERSE_TONEMAP", "PREMULTIPLY_LIT_COLOR"}, - render::ShaderReplacementDefaults::Process); + program = + render::engine->requestShader("TEXTURE_DRAW_RAW_RENDERIMAGE_PLAIN", + parent.addStructureRules({getImageOriginRule(imageOrigin), "TEXTURE_SHADE_COLOR", + "INVERSE_TONEMAP", "PREMULTIPLY_LIT_COLOR"}), + render::ShaderReplacementDefaults::SceneObjectNoSlice); program->setAttribute("a_position", render::engine->screenTrianglesCoords()); program->setTextureFromBuffer("t_depth", depths.getRenderTextureBuffer().get()); diff --git a/src/render/opengl/shaders/texture_draw_shaders.cpp b/src/render/opengl/shaders/texture_draw_shaders.cpp index 28742ec0..322532d5 100644 --- a/src/render/opengl/shaders/texture_draw_shaders.cpp +++ b/src/render/opengl/shaders/texture_draw_shaders.cpp @@ -133,7 +133,7 @@ const ShaderStageSpecification PLAIN_RENDERIMAGE_TEXTURE_DRAW_FRAG_SHADER = { {"u_projMatrix", RenderDataType::Matrix44Float}, {"u_invProjMatrix", RenderDataType::Matrix44Float}, {"u_viewport", RenderDataType::Vector4Float}, - {"u_transparency", RenderDataType::Float}, + {"u_textureTransparency", RenderDataType::Float}, }, // attributes @@ -151,7 +151,7 @@ R"( uniform mat4 u_projMatrix; uniform mat4 u_invProjMatrix; uniform vec4 u_viewport; - uniform float u_transparency; + uniform float u_textureTransparency; in vec2 tCoord; uniform sampler2D t_depth; @@ -167,6 +167,9 @@ R"( // Fetch values from texture float depth = texture(t_depth, tCoord).r; + + ${ GLOBAL_FRAGMENT_FILTER_PREP }$ + ${ GLOBAL_FRAGMENT_FILTER }$ if(depth > LARGE_FLOAT()) { discard; @@ -192,7 +195,7 @@ R"( ${ GENERATE_LIT_COLOR }$ // Set alpha - float alphaOut = u_transparency; + float alphaOut = u_textureTransparency; ${ GENERATE_ALPHA }$ ${ PERTURB_LIT_COLOR }$ @@ -215,7 +218,7 @@ const ShaderStageSpecification PLAIN_RAW_RENDERIMAGE_TEXTURE_DRAW_FRAG_SHADER = {"u_projMatrix", RenderDataType::Matrix44Float}, {"u_invProjMatrix", RenderDataType::Matrix44Float}, {"u_viewport", RenderDataType::Vector4Float}, - {"u_transparency", RenderDataType::Float}, + {"u_textureTransparency", RenderDataType::Float}, }, // attributes @@ -233,7 +236,7 @@ R"( uniform mat4 u_projMatrix; uniform mat4 u_invProjMatrix; uniform vec4 u_viewport; - uniform float u_transparency; + uniform float u_textureTransparency; in vec2 tCoord; uniform sampler2D t_depth; @@ -275,7 +278,7 @@ R"( ${ GENERATE_LIT_COLOR }$ // Set alpha - float alphaOut = u_transparency; + float alphaOut = u_textureTransparency; ${ GENERATE_ALPHA }$ ${ PERTURB_LIT_COLOR }$ @@ -608,14 +611,14 @@ const ShaderReplacementRule TEXTURE_SET_TRANSPARENCY( /* rule name */ "TEXTURE_SET_TRANSPARENCY", { /* replacement sources */ {"FRAG_DECLARATIONS", R"( - uniform float u_transparency; + uniform float u_textureTransparency; )" }, {"TEXTURE_OUT_ADJUST", R"( - textureOut = vec4(textureOut.rgb, textureOut.a * u_transparency); + textureOut = vec4(textureOut.rgb, textureOut.a * u_textureTransparency); )"} }, /* uniforms */ { - {"u_transparency", RenderDataType::Float}, + {"u_textureTransparency", RenderDataType::Float}, }, /* attributes */ {}, /* textures */ {} @@ -625,14 +628,14 @@ const ShaderReplacementRule TEXTURE_SET_TRANSPARENCY_PREMULTIPLIED( /* rule name */ "TEXTURE_SET_TRANSPARENCY_PREMULTIPLIED", { /* replacement sources */ {"FRAG_DECLARATIONS", R"( - uniform float u_transparency; + uniform float u_textureTransparency; )" }, {"TEXTURE_OUT_ADJUST", R"( - textureOut *= u_transparency; + textureOut *= u_textureTransparency; )"} }, /* uniforms */ { - {"u_transparency", RenderDataType::Float}, + {"u_textureTransparency", RenderDataType::Float}, }, /* attributes */ {}, /* textures */ {} diff --git a/src/render_image_quantity_base.cpp b/src/render_image_quantity_base.cpp index b9a4f638..461a7355 100644 --- a/src/render_image_quantity_base.cpp +++ b/src/render_image_quantity_base.cpp @@ -64,6 +64,24 @@ void RenderImageQuantityBase::updateBaseBuffers(const std::vector& newDep requestRedraw(); } +void RenderImageQuantityBase::setRenderImageUniforms(render::ShaderProgram& program, bool withTonemap) { + parent.setStructureUniforms(program); + + glm::mat4 P = view::getCameraPerspectiveMatrix(); + glm::mat4 Pinv = glm::inverse(P); + + program.setUniform("u_projMatrix", glm::value_ptr(P)); + program.setUniform("u_invProjMatrix", glm::value_ptr(Pinv)); + program.setUniform("u_viewport", render::engine->getCurrentViewport()); + program.setUniform("u_textureTransparency", transparency.get()); + if (program.hasUniform("u_transparency")) { + program.setUniform("u_transparency", 1.0f); + } + + if (withTonemap) { + render::engine->setTonemapUniforms(program); + } +} void RenderImageQuantityBase::drawPickDelayed() { if (!isEnabled()) return; @@ -77,19 +95,13 @@ void RenderImageQuantityBase::drawPickDelayed() { pickProgram->setUniform("u_projMatrix", glm::value_ptr(P)); pickProgram->setUniform("u_invProjMatrix", glm::value_ptr(Pinv)); pickProgram->setUniform("u_viewport", render::engine->getCurrentViewport()); - pickProgram->setUniform("u_transparency", 1.0); + pickProgram->setUniform("u_textureTransparency", 1.0); pickProgram->setUniform("u_color", pickColor); // draw pickProgram->draw(); } -void RenderImageQuantityBase::refresh() { - pickProgram = nullptr; - Quantity::refresh(); -} - - void RenderImageQuantityBase::preparePick() { // Request pick indices @@ -100,10 +112,10 @@ void RenderImageQuantityBase::preparePick() { // Create the sourceProgram // clang-format off pickProgram = render::engine->requestShader("TEXTURE_DRAW_RENDERIMAGE_PLAIN", - { + parent.addStructureRules({ getImageOriginRule(imageOrigin), "SHADECOLOR_FROM_UNIFORM", - }, + }), render::ShaderReplacementDefaults::Pick ); // clang-format on @@ -112,6 +124,11 @@ void RenderImageQuantityBase::preparePick() { pickProgram->setTextureFromBuffer("t_depth", depths.getRenderTextureBuffer().get()); } +void RenderImageQuantityBase::refresh() { + pickProgram = nullptr; + Quantity::refresh(); +} + void RenderImageQuantityBase::disableFullscreenDrawing() { if (isEnabled()) { setEnabled(false); diff --git a/src/scalar_image_quantity.cpp b/src/scalar_image_quantity.cpp index ef3c74c9..c9a9f383 100644 --- a/src/scalar_image_quantity.cpp +++ b/src/scalar_image_quantity.cpp @@ -77,7 +77,7 @@ void ScalarImageQuantity::showFullscreen() { // Set uniforms this->setScalarUniforms(*fullscreenProgram); - fullscreenProgram->setUniform("u_transparency", getTransparency()); + fullscreenProgram->setUniform("u_textureTransparency", getTransparency()); fullscreenProgram->draw(); @@ -90,7 +90,7 @@ void ScalarImageQuantity::renderIntermediate() { // Set uniforms this->setScalarUniforms(*fullscreenProgram); - fullscreenProgram->setUniform("u_transparency", getTransparency()); + fullscreenProgram->setUniform("u_textureTransparency", getTransparency()); // render to the intermediate texture render::engine->pushBindFramebufferForRendering(*framebufferIntermediate); @@ -133,7 +133,7 @@ void ScalarImageQuantity::showInBillboard(glm::vec3 center, glm::vec3 upVec, glm // set uniforms parent.setStructureUniforms(*billboardProgram); - billboardProgram->setUniform("u_transparency", getTransparency()); + billboardProgram->setUniform("u_textureTransparency", getTransparency()); billboardProgram->setUniform("u_billboardCenter", center); billboardProgram->setUniform("u_billboardUp", upVec); billboardProgram->setUniform("u_billboardRight", rightVec); diff --git a/src/scalar_render_image_quantity.cpp b/src/scalar_render_image_quantity.cpp index 27bb3d34..05da3c1e 100644 --- a/src/scalar_render_image_quantity.cpp +++ b/src/scalar_render_image_quantity.cpp @@ -27,15 +27,7 @@ void ScalarRenderImageQuantity::drawDelayed() { if (!program) prepare(); - // set uniforms - glm::mat4 P = view::getCameraPerspectiveMatrix(); - glm::mat4 Pinv = glm::inverse(P); - - program->setUniform("u_projMatrix", glm::value_ptr(P)); - program->setUniform("u_invProjMatrix", glm::value_ptr(Pinv)); - program->setUniform("u_viewport", render::engine->getCurrentViewport()); - program->setUniform("u_transparency", transparency.get()); - + setRenderImageUniforms(*program); setScalarUniforms(*program); render::engine->setMaterialUniforms(*program, material.get()); @@ -83,14 +75,14 @@ void ScalarRenderImageQuantity::prepare() { program = render::engine->requestShader("TEXTURE_DRAW_RENDERIMAGE_PLAIN", render::engine->addMaterialRules(material.get(), addScalarRules( - { + parent.addStructureRules({ getImageOriginRule(imageOrigin), hasNormals ? "SHADE_NORMAL_FROM_TEXTURE" : "SHADE_NORMAL_FROM_VIEWPOS_VAR", "TEXTURE_PROPAGATE_VALUE", - } + }) ) ), - render::ShaderReplacementDefaults::Process); + render::ShaderReplacementDefaults::SceneObjectNoSlice); // clang-format on program->setAttribute("a_position", render::engine->screenTrianglesCoords()); diff --git a/src/structure.cpp b/src/structure.cpp index 264e0ff3..9b23f645 100644 --- a/src/structure.cpp +++ b/src/structure.cpp @@ -237,8 +237,10 @@ std::vector Structure::addStructureRules(std::vector i } void Structure::setStructureUniforms(render::ShaderProgram& p) { - glm::mat4 viewMat = getModelView(); - p.setUniform("u_modelView", glm::value_ptr(viewMat)); + if (p.hasUniform("u_modelView")) { + glm::mat4 viewMat = getModelView(); + p.setUniform("u_modelView", glm::value_ptr(viewMat)); + } if (p.hasUniform("u_projMatrix")) { glm::mat4 projMat = view::getCameraPerspectiveMatrix();