summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--indra/llrender/llglslshader.h2
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/pbropaqueV.glsl7
-rw-r--r--indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl93
-rw-r--r--indra/newview/lldrawpoolpbropaque.cpp2
4 files changed, 82 insertions, 22 deletions
diff --git a/indra/llrender/llglslshader.h b/indra/llrender/llglslshader.h
index 6b4778c270..68e1a8954d 100644
--- a/indra/llrender/llglslshader.h
+++ b/indra/llrender/llglslshader.h
@@ -52,7 +52,7 @@ public:
bool hasShadows;
bool hasAmbientOcclusion;
bool hasSrgb;
- bool encodesNormal;
+ bool encodesNormal; // include: shaders\class1\environment\encodeNormF.glsl
bool isDeferred;
bool hasIndirect;
S32 mIndexedTextureChannels;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/pbropaqueV.glsl b/indra/newview/app_settings/shaders/class1/deferred/pbropaqueV.glsl
index a2606ed771..82338069a8 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/pbropaqueV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/pbropaqueV.glsl
@@ -78,23 +78,24 @@ VARYING vec2 vary_texcoord0;
void main()
{
+ vec4 pos4 = vec4(position,1.0);
#ifdef HAS_SKIN
mat4 mat = getObjectSkinnedTransform();
mat = modelview_matrix * mat;
- vec3 pos = (mat*vec4(position.xyz,1.0)).xyz;
+ vec3 pos = (mat*pos4).xyz;
#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND)
vary_position = pos;
#endif
- gl_Position = projection_matrix*vec4(pos,1.0);
+ gl_Position = projection_matrix*pos4;
#else
//transform vertex
- gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
+ gl_Position = modelview_projection_matrix * pos4;
#endif
vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
diff --git a/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl
index 243f1c4498..ff2b87b9df 100644
--- a/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl
+++ b/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl
@@ -26,12 +26,14 @@
#define DEBUG_PBR_PACKORM0 0 // Rough=0, Metal=0
#define DEBUG_PBR_PACKORM1 0 // Rough=1, Metal=1
#define DEBUG_PBR_TANGENT1 1 // Tangent = 1,0,0
+#define DEBUG_PBR_VERT2CAM1 0 // vertex2camera = 0,0,1
#define DEBUG_PBR_RAW_DIFF 0 // Output: use diffuse in G-Buffer
#define DEBUG_PBR_RAW_SPEC 0 // Output: use spec in G-Buffer
#define DEBUG_PBR_IRRADIANCE 0 // Output: Diffuse Irradiance
#define DEBUG_PBR_DIFFUSE 0 // Output: Radiance Lambertian
#define DEBUG_PBR_ORM 0 // Output: Packed Occlusion Roughness Metal
+#define DEBUG_PBR_OCCLUSION 0 // Output: Occlusion map
#define DEBUG_PBR_ROUGH_PERCEPTUAL 0 // Output: grayscale Perceptual Roughenss
#define DEBUG_PBR_ROUGH_ALPHA 0 // Output: grayscale Alpha Roughness
#define DEBUG_PBR_METAL 0 // Output: grayscale metal
@@ -41,12 +43,22 @@
#define DEBUG_PBR_SPEC 0 // Output: Final spec
#define DEBUG_PBR_SPEC_REFLECTION 0 // Output: reflection
#define DEBUG_PBR_NORMAL 0 // Output: passed in normal. To see raw normal map: set DEBUG_PBR_RAW_DIFF 1, and in pbropaqueF set DEBUG_NORMAL_RAW
-#define DEBUG_PBR_VIEW 0 // Output: view_dir
+#define DEBUG_PBR_TANGENT 0 // Output: Tangent
+#define DEBUG_PBR_BITANGET 0 // Output: Bitangnet
+#define DEBUG_PBR_V2C_RAW 0 // Output: vertex2camera
+#define DEBUG_PBR_V2C_REMAP 0 // Output: vertex2camera (remap [-1,1] -> [0,1])
#define DEBUG_PBR_BRDF 0 // Output: Environment BRDF
-#define DEBUG_PBR_DOT_NV 0 // Output: grayscale dot(Normal,ViewDir)
-#define DEBUG_PBR_DOT_TV 0 // Output:
-#define DEBUG_PBR_DOT_BV 0 // Output:
+#define DEBUG_PBR_DOT_NV 0 // Output: grayscale dot(Normal ,Vertex2Camera)
+#define DEBUG_PBR_DOT_TV 0 // Output: grayscale dot(Tangent ,Vertex2Camera)
+#define DEBUG_PBR_DOT_BV 0 // Output: graysacle dot(Bitangent,Vertex2Camera)
#define DEBUG_PBR_FRESNEL 0 // Output: roughness dependent fresnel
+#define DEBUG_PBR_KSPEC 0 // Output: K spec
+#define DEBUG_PBR_IOR 0 // Output: grayscale IOR
+#define DEBUG_PBR_REFLECT0_BASE 0 // Output: black reflect0 default from ior
+#define DEBUG_PBR_REFLECT0_MIX 0 // Output: diffuse reflect0 calculated from ior
+#define DEBUG_PBR_FE_GGX 0 // Output: FssEssGGX
+#define DEBUG_PBR_FE_LAMBERT 0 // Output: FssEssLambert
+#define DEBUG_PBR_DIFFUSE_K 0 // Output: diffuse FssEssLambert + FmsEms
#extension GL_ARB_texture_rectangle : enable
#extension GL_ARB_shader_texture_lod : enable
@@ -184,6 +196,8 @@ void main()
vec3 legacyenv;
sampleReflectionProbes(ambenv, glossenv, legacyenv, pos.xyz, norm.xyz, spec.a, envIntensity);
+ amblit = max(ambenv, amblit);
+
bool hasPBR = GET_GBUFFER_FLAG(GBUFFER_FLAG_HAS_PBR);
if (hasPBR)
{
@@ -201,15 +215,21 @@ void main()
#if DEBUG_PBR_PACK_ORM1
packedORM = vec3(1,1,1);
#endif
- float IOR = 1.5; // default Index Of Reflection 1.5
+ float IOR = 1.5; // default Index Of Refraction 1.5 (dielectrics)
vec3 reflect0 = vec3(0.04); // -> incidence reflectance 0.04
-
- IOR = 0.0; // TODO: Set from glb
- reflect0 = calcBaseReflect0(IOR);
+#if HAS_IOR
+ reflect0 = calcBaseReflect0(IOR);
+#endif
+#if DEBUG_PBR_REFLECT0_BASE
+ vec3 debug_reflect0 = reflect0;
+#endif
float metal = packedORM.b;
vec3 reflect90 = vec3(0);
- vec3 v = view_dir;
+ vec3 v = -normalize(pos.xyz);
+#if DEBUG_PBR_VERT2CAM1
+ v = vec3(0,0,1);
+#endif
vec3 n = norm.xyz;
// vec3 t = texture2DRect(tangentMap, tc).rgb;
#if DEBUG_PBR_TANGENT1
@@ -219,8 +239,8 @@ void main()
vec3 reflectVN = normalize(reflect(-v,n));
float dotNV = clamp(dot(n,v),0,1);
- float dotTV = clamp(dot(n,t),0,1);
- float dotBV = clamp(dot(n,b),0,1);
+ float dotTV = clamp(dot(t,v),0,1);
+ float dotBV = clamp(dot(b,v),0,1);
// Reference: getMetallicRoughnessInfo
float perceptualRough = packedORM.g;
@@ -228,7 +248,9 @@ void main()
vec3 colorDiff = mix( diffuse.rgb, vec3(0) , metal);
reflect0 = mix( reflect0 , diffuse.rgb, metal); // reflect at 0 degrees
reflect90 = vec3(1); // reflect at 90 degrees
+#if DEBUG_PBR_REFLECTANCE
float reflectance = max( max( reflect0.r, reflect0.g ), reflect0.b );
+#endif
// Common to RadianceGGX and RadianceLambertian
float specWeight = 1.0;
@@ -238,12 +260,13 @@ void main()
vec3 kSpec = reflect0 + fresnelR*pow(1.0 - dotNV, 5.0);
// Reference: getIBLRadianceGGX
+ vec3 reflection = normalize(reflect(-v,n));
vec3 specLight = getSpecularPBR(reflection);
#if HAS_IBL
kSpec = mix( kSpec, iridescenceFresnel, iridescenceFactor);
#endif
- vec3 FssEssRadiance = kSpec*vScaleBias.x + vScaleBias.y;
- colorSpec += specWeight * specLight * FssEssRadiance;
+ vec3 FssEssGGX = kSpec*vScaleBias.x + vScaleBias.y;
+ colorSpec += specWeight * specLight * FssEssGGX;
// Reference: getIBLRadianceLambertian
vec3 irradiance = getDiffuseLightPBR(n);
@@ -255,7 +278,11 @@ void main()
vec3 kDiffuse = colorDiffuse * (1.0 - FssEssLambert + FmsEms);
colorDiffuse += (FmsEms + kDiffuse) * irradiance;
- color.rgb = colorDiffuse + colorEmissive + colorSpec;
+ float occlusion_strength = 1.0; // TODO: From glb
+ float ao = packedORM.r;
+ colorDiffuse = mix(colorDiffuse, colorDiffuse * ao, occlusion_strength);
+
+ color.rgb = colorDiffuse + colorEmissive + colorSpec;
#if DEBUG_PBR_BRDF_UV
color.rgb = vec3(brdfPoint,0.0);
@@ -266,12 +293,24 @@ void main()
#if DEBUG_PBR_FRESNEL
color.rgb = fresnelR;
#endif
+ #if DEBUG_PBR_IOR
+ color.rgb = vec3(IOR);
+ #endif
+ #if DEBUG_PBR_KSPEC
+ color.rgb = kSpec;
+ #endif
#if DEBUG_PBR_RAW_DIFF
color.rgb = diffuse.rgb;
#endif
#if DEBUG_PBR_RAW_SPEC
color.rgb = spec.rgb;
#endif
+ #if DEBUG_PBR_REFLECT0_BASE
+ color.rgb = vec3(debug_reflect0);
+ #endif
+ #if DEBUG_PBR_REFLECT0_MIX
+ color.rgb = vec3(reflect0);
+ #endif
#if DEBUG_PBR_REFLECTANCE
color.rgb = vec3(reflectance);
#endif
@@ -281,6 +320,9 @@ void main()
#if DEBUG_PBR_DIFFUSE
color.rgb = colorDiffuse;
#endif
+ #if DEBUG_PBR_DIFFUSE_K
+ color.rgb = kDiffuse;
+ #endif
#if DEBUG_PBR_EMISSIVE
color.rgb = colorEmissive;
#endif
@@ -299,14 +341,26 @@ void main()
#if DEBUG_PBR_SPEC_REFLECTION
color.rgb = specLight;
#endif
+ #if DEBUG_PBR_OCCLUSION
+ color.rgb = vec3(packedORM.r);
+ #endif
#if DEBUG_PBR_ORM
color.rgb = packedORM;
#endif
#if DEBUG_PBR_NORMAL
color.rgb = norm.xyz;
#endif
- #if DEBUG_PBR_VIEW
- color.rgb = view_dir;
+ #if DEBUG_PBR_TANGENT
+ color.rgb = t;
+ #endif
+ #if DEBUG_PBR_BITANGENT
+ color.rgb = b;
+ #endif
+ #if DEBUG_PBR_V2C_RAW
+ color.rgb = v;
+ #endif
+ #if DEBUG_PBR_V2C_REMAP
+ color.rgb = v*0.5 + vec3(0.5);
#endif
#if DEBUG_PBR_DOT_NV
color.rgb = vec3(dotNV);
@@ -317,10 +371,15 @@ void main()
#if DEBUG_PBR_DOT_BV
color.rgb = vec3(dotBV);
#endif
+ #if DEBUG_PBR_FE_GGX
+ color.rgb = FssEssGGX; // spec
+ #endif
+ #if DEBUG_PBR_FE_LAMBERT
+ color.rgb = FssEssLambert; // diffuse
+ #endif
}
else
{
- amblit = max(ambenv, amblit);
color.rgb = amblit*ambocc;
//float ambient = min(abs(dot(norm.xyz, sun_dir.xyz)), 1.0);
diff --git a/indra/newview/lldrawpoolpbropaque.cpp b/indra/newview/lldrawpoolpbropaque.cpp
index b0f1867e9a..86d73de14e 100644
--- a/indra/newview/lldrawpoolpbropaque.cpp
+++ b/indra/newview/lldrawpoolpbropaque.cpp
@@ -130,7 +130,7 @@ void LLDrawPoolPBROpaque::renderDeferred(S32 pass)
if (params.mEmissiveMap)
{
- gDeferredPBROpaqueProgram.bindTexture(LLShaderMgr::EMISSIVE_MAP, params.mEmissiveMap); // Packed Occlusion Roughness Metal
+ gDeferredPBROpaqueProgram.bindTexture(LLShaderMgr::EMISSIVE_MAP, params.mEmissiveMap);
}
else
{