summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPtolemy <ptolemy@lindenlab.com>2022-09-02 16:12:49 -0700
committerPtolemy <ptolemy@lindenlab.com>2022-09-02 16:12:49 -0700
commit7229dfcc59943f025219721701b2bda471a2ae25 (patch)
tree99d9a93c3e7e32aff2c851b2a627d41ec8daa8f5
parent7bb5315847f6ad68927efac9914bee3bb81bb894 (diff)
SL-17701: PBR: Add support for gltf Alpha MASK (cutoff)
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/pbropaqueF.glsl12
-rw-r--r--indra/newview/lldrawpoolpbropaque.cpp10
-rw-r--r--indra/newview/llmaterialeditor.cpp2
3 files changed, 21 insertions, 3 deletions
diff --git a/indra/newview/app_settings/shaders/class1/deferred/pbropaqueF.glsl b/indra/newview/app_settings/shaders/class1/deferred/pbropaqueF.glsl
index b5c38bba04..b0becdbb5b 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/pbropaqueF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/pbropaqueF.glsl
@@ -76,17 +76,23 @@ VARYING vec2 vary_texcoord1;
VARYING vec2 vary_texcoord2;
#endif
+uniform float minimum_alpha; // PBR alphaMode: MASK, See: mAlphaCutoff, setAlphaCutoff()
+
vec2 encode_normal(vec3 n);
vec3 linear_to_srgb(vec3 c);
-const float M_PI = 3.141592653589793;
-
void main()
{
// IF .mFeatures.mIndexedTextureChannels = LLGLSLShader::sIndexedTextureChannels;
// vec3 col = vertex_color.rgb * diffuseLookup(vary_texcoord0.xy).rgb;
// else
- vec3 col = vertex_color.rgb * texture2D(diffuseMap, vary_texcoord0.xy).rgb;
+ vec4 albedo = texture2D(diffuseMap, vary_texcoord0.xy).rgba;
+ if (albedo.a < minimum_alpha)
+ {
+ discard;
+ }
+
+ vec3 col = vertex_color.rgb * albedo.rgb;
#ifdef HAS_NORMAL_MAP
vec4 norm = texture2D(bumpMap, vary_texcoord1.xy);
diff --git a/indra/newview/lldrawpoolpbropaque.cpp b/indra/newview/lldrawpoolpbropaque.cpp
index 3930e11cf3..9fc3d51cad 100644
--- a/indra/newview/lldrawpoolpbropaque.cpp
+++ b/indra/newview/lldrawpoolpbropaque.cpp
@@ -95,6 +95,16 @@ void LLDrawPoolPBROpaque::renderDeferred(S32 pass)
for (LLCullResult::drawinfo_iterator i = begin; i != end; ++i)
{
LLDrawInfo* pparams = *i;
+ LLGLTFMaterial *mat = pparams->mGLTFMaterial;
+
+ // glTF 2.0 Specification 3.9.4. Alpha Coverage
+ // mAlphaCutoff is only valid for LLGLTFMaterial::ALPHA_MODE_MASK
+ F32 min_alpha = -1.0;
+ if (mat->mAlphaMode == LLGLTFMaterial::ALPHA_MODE_MASK)
+ {
+ min_alpha = mat->mAlphaCutoff;
+ }
+ shader->uniform1f(LLShaderMgr::MINIMUM_ALPHA, min_alpha);
if (pparams->mTexture.notNull())
{
diff --git a/indra/newview/llmaterialeditor.cpp b/indra/newview/llmaterialeditor.cpp
index 5acf0600b6..6461aa71a6 100644
--- a/indra/newview/llmaterialeditor.cpp
+++ b/indra/newview/llmaterialeditor.cpp
@@ -1574,6 +1574,7 @@ void LLMaterialEditor::getGLTFMaterial(LLGLTFMaterial* mat)
mat->mDoubleSided = getDoubleSided();
mat->setAlphaMode(getAlphaMode());
+ mat->mAlphaCutoff = getAlphaCutoff();
}
void LLMaterialEditor::setFromGLTFMaterial(LLGLTFMaterial* mat)
@@ -1591,6 +1592,7 @@ void LLMaterialEditor::setFromGLTFMaterial(LLGLTFMaterial* mat)
setDoubleSided(mat->mDoubleSided);
setAlphaMode(mat->getAlphaMode());
+ setAlphaCutoff(mat->mAlphaCutoff);
}
void LLMaterialEditor::loadAsset()