summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCosmic Linden <cosmic@lindenlab.com>2023-10-13 09:57:48 -0700
committerCosmic Linden <cosmic@lindenlab.com>2023-10-13 09:57:48 -0700
commita7cd5f6ef9d80e77eaf87cfc605d32605f0916f1 (patch)
tree28f800ef899b39fa207f5f74b0294d8af8666105
parent7376b3e4b9c03f3ff3aa0c431c66916ac655a692 (diff)
DRTVWR-592: (WIP) (does not run) PBR terrain rendering - more work on shaders, uniforms
-rw-r--r--indra/llrender/llshadermgr.cpp6
-rw-r--r--indra/llrender/llshadermgr.h6
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/pbrterrainF.glsl28
3 files changed, 23 insertions, 17 deletions
diff --git a/indra/llrender/llshadermgr.cpp b/indra/llrender/llshadermgr.cpp
index 89f39d7011..b2c8255d2a 100644
--- a/indra/llrender/llshadermgr.cpp
+++ b/indra/llrender/llshadermgr.cpp
@@ -1447,6 +1447,12 @@ void LLShaderMgr::initAttribsAndUniforms()
mReservedUniforms.push_back("detail_2_emissive");
mReservedUniforms.push_back("detail_3_emissive");
+ mReservedUniforms.push_back("baseColorFactors");
+ mReservedUniforms.push_back("metallicFactors");
+ mReservedUniforms.push_back("roughnessFactors");
+ mReservedUniforms.push_back("emissiveColors");
+ mReservedUniforms.push_back("minimum_alphas");
+
mReservedUniforms.push_back("origin");
mReservedUniforms.push_back("display_gamma");
diff --git a/indra/llrender/llshadermgr.h b/indra/llrender/llshadermgr.h
index b43ccf2ec2..151e94093d 100644
--- a/indra/llrender/llshadermgr.h
+++ b/indra/llrender/llshadermgr.h
@@ -268,6 +268,12 @@ public:
TERRAIN_DETAIL2_EMISSIVE, // "detail_2_emissive" (GLTF)
TERRAIN_DETAIL3_EMISSIVE, // "detail_3_emissive" (GLTF)
+ TERRAIN_BASE_COLOR_FACTORS, // "baseColorFactors" (GLTF)
+ TERRAIN_METALLIC_FACTORS, // "metallicFactors" (GLTF)
+ TERRAIN_ROUGHNESS_FACTORS, // "roughnessFactors" (GLTF)
+ TERRAIN_EMISSIVE_COLORS, // "emissiveColors" (GLTF)
+ TERRAIN_MINIMUM_ALPHAS, // "minimum_alphas" (GLTF)
+
SHINY_ORIGIN, // "origin"
DISPLAY_GAMMA, // "display_gamma"
diff --git a/indra/newview/app_settings/shaders/class1/deferred/pbrterrainF.glsl b/indra/newview/app_settings/shaders/class1/deferred/pbrterrainF.glsl
index f355b8ef98..4a0b324558 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/pbrterrainF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/pbrterrainF.glsl
@@ -48,8 +48,8 @@ uniform sampler2D detail_1_emissive;
uniform sampler2D detail_2_emissive;
uniform sampler2D detail_3_emissive;
-// TODO: Needs new uniforms
// *TODO: More efficient packing?
+uniform vec4[4] baseColorFactors; // See also vertex_color in pbropaqueV.glsl
uniform vec4 metallicFactors;
uniform vec4 roughnessFactors;
uniform vec3[4] emissiveColors;
@@ -101,9 +101,6 @@ vec4 sample_and_mix_vector(float alpha1, float alpha2, float alphaFinal, vec2 te
return terrain_mix(samples, alpha1, alpha2, alphaFinal);
}
-// TODO: Implement
-// TODO: Don't forget calls to srgb_to_linear during texture sampling
-// TODO: Wherever base color alpha is not 1.0, blend with black
void main()
{
float alpha1 = texture2D(alpha_ramp, vary_texcoord0.zw).a;
@@ -111,23 +108,22 @@ void main()
float alphaFinal = texture2D(alpha_ramp, vary_texcoord1.zw).a;
vec4 base_color = sample_and_mix_color(alpha1, alpha2, alphaFinal, vary_texcoord0.xy, detail_0_basecolor, detail_1_basecolor, detail_2_basecolor, detail_3_basecolor);
+ float minimum_alpha = terrain_mix(minimum_alphas, alpha1, alpha2, alphaFinal);
+ if (base_color.a < minimum_alpha)
+ {
+ discard;
+ }
+
vec4 normal_texture = sample_and_mix_vector(alpha1, alpha2, alphaFinal, vary_texcoord0.xy, detail_0_normal, detail_1_normal, detail_2_normal, detail_3_normal);
vec4 metallic_roughness = sample_and_mix_vector(alpha1, alpha2, alphaFinal, vary_texcoord0.xy, detail_0_metallic_roughness, detail_1_metallic_roughness, detail_2_metallic_roughness, detail_3_metallic_roughness);
vec4 emissive_texture = sample_and_mix_color(alpha1, alpha2, alphaFinal, vary_texcoord0.xy, detail_0_emissive, detail_1_emissive, detail_2_emissive, detail_3_emissive);
+ vec4 baseColorFactor = terrain_mix(baseColorFactors, alpha1, alpha2, alphaFinal);
float metallicFactor = terrain_mix(metallicFactors, alpha1, alpha2, alphaFinal);
float roughnessFactor = terrain_mix(roughnessFactors, alpha1, alpha2, alphaFinal);
vec3 emissiveColor = terrain_mix(emissiveColors, alpha1, alpha2, alphaFinal);
- float minimum_alpha = terrain_mix(minimum_alphas, alpha1, alpha2, alphaFinal);
-
- // TODO: OOh, we need blending for every GLTF uniform too
- // TODO: Unfork
- if (base_color.a < minimum_alpha)
- {
- base_color.rgb *= vec3(0.0);
- }
- vec3 col = base_color.rgb;
+ vec3 col = baseColorFactor.rgb * srgb_to_linear(basecolor.rgb);
// from mikktspace.com
vec3 vNt = normal_texture.xyz*2.0-1.0;
@@ -155,10 +151,8 @@ void main()
frag_data[0] = max(vec4(col, 0.0), vec4(0)); // Diffuse
- // TODO: What is packed into vertex_color.a?
- frag_data[1] = max(vec4(spec.rgb,vertex_color.a), vec4(0)); // PBR linear packed Occlusion, Roughness, Metal.
- // TODO: What is environment intensity and do we want it?
- frag_data[2] = max(vec4(encode_normal(tnorm), 0.0, GBUFFER_FLAG_HAS_PBR | GBUFFER_FLAG_HAS_ATMOS), vec4(0)); // normal, environment intensity, flags
+ frag_data[1] = max(vec4(spec.rgb,baseColorFactor.a), vec4(0)); // PBR linear packed Occlusion, Roughness, Metal.
+ frag_data[2] = max(vec4(encode_normal(tnorm), baseColorFactor.a, GBUFFER_FLAG_HAS_PBR | GBUFFER_FLAG_HAS_ATMOS), vec4(0)); // normal, environment intensity, flags
frag_data[3] = max(vec4(emissive,0), vec4(0)); // PBR sRGB Emissive
}