diff options
author | Tomi Korpipaa <tomi.korpipaa@qt.io> | 2021-05-03 13:26:46 +0300 |
---|---|---|
committer | Tomi Korpipaa <tomi.korpipaa@qt.io> | 2021-05-07 08:43:03 +0300 |
commit | e6c8ed87170fc39cf7d67c371e838d7f3f1b9003 (patch) | |
tree | 36ee669c98784a34d0693b13d743a505d939aa02 | |
parent | 8265c6523d3206c0604ad933ba5d36f3c7c79b46 (diff) |
Handle opacityMap with NoLighting
All other maps were ignored with NoLighting but diffuse/baseColor.
Fixes: QTBUG-90677
Change-Id: I8b520de5398f8bbe6ea5c9d7363cf76740f88fc0
Reviewed-by: Andy Nichols <andy.nichols@qt.io>
-rw-r--r-- | src/runtimerender/qssgrenderdefaultmaterialshadergenerator.cpp | 28 |
1 files changed, 27 insertions, 1 deletions
diff --git a/src/runtimerender/qssgrenderdefaultmaterialshadergenerator.cpp b/src/runtimerender/qssgrenderdefaultmaterialshadergenerator.cpp index dab391f8..69db4497 100644 --- a/src/runtimerender/qssgrenderdefaultmaterialshadergenerator.cpp +++ b/src/runtimerender/qssgrenderdefaultmaterialshadergenerator.cpp @@ -792,6 +792,9 @@ struct QSSGShaderGenerator : public QSSGDefaultMaterialShaderGeneratorInterface // translucency map QSSGRenderableImage *translucencyImage = nullptr; quint32 translucencyImageIdx = 0; + // opacity map + QSSGRenderableImage *opacityImage = nullptr; + quint32 opacityImageIdx = 0; // lightmaps QSSGRenderableImage *lightmapIndirectImage = nullptr; quint32 lightmapIndirectImageIdx = 0; @@ -861,6 +864,9 @@ struct QSSGShaderGenerator : public QSSGDefaultMaterialShaderGeneratorInterface } else if (img->m_mapType == QSSGImageMapTypes::Translucency) { translucencyImage = img; translucencyImageIdx = imageIdx; + } else if (img->m_mapType == QSSGImageMapTypes::Opacity) { + opacityImage = img; + opacityImageIdx = imageIdx; } else if (img->m_mapType == QSSGImageMapTypes::Emissive) { hasEmissiveMap = true; } else if (img->m_mapType == QSSGImageMapTypes::LightmapIndirect) { @@ -1416,7 +1422,27 @@ struct QSSGShaderGenerator : public QSSGDefaultMaterialShaderGeneratorInterface // Ensure the rgb colors are in range. fragmentShader.append(" fragOutput = vec4(clamp(global_diffuse_light.rgb + global_specular_light.rgb, 0.0, 1.0), global_diffuse_light.a);"); } else { - fragmentShader.append(" fragOutput = vec4(diffuseColor.rgb, diffuseColor.a * objectOpacity);"); + // NoLighting + // Check if we have opacityMap + if (opacityImage) { + fragmentShader.append(" vec4 texture_opacity;"); + + QByteArray texSwizzle; + QByteArray lookupSwizzle; + + if (identityImages.contains(opacityImage)) + generateImageUVSampler(opacityImageIdx); + else + generateImageUVCoordinates(opacityImageIdx, *opacityImage); + generateTextureSwizzle(opacityImage->m_image.m_textureData.m_texture->textureSwizzleMode(), texSwizzle, lookupSwizzle); + + fragmentShader << " texture_opacity" << texSwizzle << " = texture2D(" << m_imageSampler << ", " << m_imageFragCoords << ")" << lookupSwizzle << ";\n"; + + const auto &channelProps = keyProps.m_textureChannels[QSSGShaderDefaultMaterialKeyProperties::OpacityChannel]; + fragmentShader << " fragOutput = vec4(diffuseColor.rgb, diffuseColor.a * objectOpacity * texture_opacity" << channelStr(channelProps, inKey) << ");"; + } else { + fragmentShader.append(" fragOutput = vec4(diffuseColor.rgb, diffuseColor.a * objectOpacity);"); + } } if (vertexGenerator().hasActiveWireframe()) { |