summaryrefslogtreecommitdiffstats
path: root/src/quick3d/imports/scene3d/scene3dsgmaterialshader.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/quick3d/imports/scene3d/scene3dsgmaterialshader.cpp')
-rw-r--r--src/quick3d/imports/scene3d/scene3dsgmaterialshader.cpp10
1 files changed, 9 insertions, 1 deletions
diff --git a/src/quick3d/imports/scene3d/scene3dsgmaterialshader.cpp b/src/quick3d/imports/scene3d/scene3dsgmaterialshader.cpp
index d25c6a7f7..55538ad1f 100644
--- a/src/quick3d/imports/scene3d/scene3dsgmaterialshader.cpp
+++ b/src/quick3d/imports/scene3d/scene3dsgmaterialshader.cpp
@@ -118,21 +118,25 @@ const char *Scene3DSGMaterialShader::fragmentShader() const
if (ctx->format().version() >= qMakePair(3, 2) && ctx->format().profile() == QSurfaceFormat::CoreProfile) {
return ""
"#version 150 core \n"
+ "uniform bool visible; \n"
"uniform sampler2D source; \n"
"uniform float qt_Opacity; \n"
"in vec2 qt_TexCoord; \n"
"out vec4 fragColor; \n"
"void main() { \n"
- " vec4 p = texture(source, qt_TexCoord); \n"
+ " if (!visible) discard; \n"
+ " vec4 p = texture(source, qt_TexCoord); \n"
" float a = qt_Opacity * p.a; \n"
" fragColor = vec4(p.rgb * a, a); \n"
"}";
} else {
return ""
+ "uniform bool visible; \n"
"uniform highp sampler2D source; \n"
"uniform highp float qt_Opacity; \n"
"varying highp vec2 qt_TexCoord; \n"
"void main() { \n"
+ " if (!visible) discard; \n"
" highp vec4 p = texture2D(source, qt_TexCoord); \n"
" highp float a = qt_Opacity * p.a; \n"
" gl_FragColor = vec4(p.rgb * a, a); \n"
@@ -144,6 +148,7 @@ void Scene3DSGMaterialShader::initialize()
{
m_matrixId = program()->uniformLocation("qt_Matrix");
m_opacityId = program()->uniformLocation("qt_Opacity");
+ m_visibleId = program()->uniformLocation("visible");
}
void Scene3DSGMaterialShader::updateState(const RenderState &state, QSGMaterial *newEffect, QSGMaterial *oldEffect)
@@ -172,6 +177,9 @@ void Scene3DSGMaterialShader::updateState(const RenderState &state, QSGMaterial
t->updateBindOptions();
}
+ if (oldTx == nullptr || oldTx->visible() != tx->visible())
+ program()->setUniformValue(m_visibleId, tx->visible());
+
if (state.isMatrixDirty())
program()->setUniformValue(m_matrixId, state.combinedMatrix());