Skip to content
Snippets Groups Projects
Commit 203f59c4 authored by Rye Mutt's avatar Rye Mutt :bread:
Browse files

Merge branch 'DRTVWR-559' of https://github.com/secondlife/viewer

parents 647e313c 41433fdb
No related branches found
No related tags found
2 merge requests!3Update to main branch,!2Rebase onto current main branch
...@@ -378,8 +378,7 @@ vec3 pbrIbl(vec3 diffuseColor, ...@@ -378,8 +378,7 @@ vec3 pbrIbl(vec3 diffuseColor,
vec3 irradiance, // irradiance map sample vec3 irradiance, // irradiance map sample
float ao, // ambient occlusion factor float ao, // ambient occlusion factor
float nv, // normal dot view vector float nv, // normal dot view vector
float perceptualRough, float perceptualRough)
out vec3 specContrib)
{ {
// retrieve a scale and bias to F0. See [1], Figure 3 // retrieve a scale and bias to F0. See [1], Figure 3
vec2 brdf = BRDF(clamp(nv, 0, 1), perceptualRough); vec2 brdf = BRDF(clamp(nv, 0, 1), perceptualRough);
...@@ -393,23 +392,9 @@ vec3 pbrIbl(vec3 diffuseColor, ...@@ -393,23 +392,9 @@ vec3 pbrIbl(vec3 diffuseColor,
specular *= computeSpecularAO(nv, ao, perceptualRough * perceptualRough) * (1.0 + specularColor * (1.0 / brdf.y - 1.0)); specular *= computeSpecularAO(nv, ao, perceptualRough * perceptualRough) * (1.0 + specularColor * (1.0 / brdf.y - 1.0));
specContrib = specular;
return (diffuse * ao) + specular; return (diffuse * ao) + specular;
} }
vec3 pbrIbl(vec3 diffuseColor,
vec3 specularColor,
vec3 radiance, // radiance map sample
vec3 irradiance, // irradiance map sample
float ao, // ambient occlusion factor
float nv, // normal dot view vector
float perceptualRough)
{
vec3 specContrib;
return pbrIbl(diffuseColor, specularColor, radiance, irradiance, ao, nv, perceptualRough, specContrib);
}
// Encapsulate the various inputs used by the various functions in the shading equation // Encapsulate the various inputs used by the various functions in the shading equation
// We store values in this struct to simplify the integration of alternative implementations // We store values in this struct to simplify the integration of alternative implementations
...@@ -475,8 +460,7 @@ vec3 pbrPunctual(vec3 diffuseColor, vec3 specularColor, ...@@ -475,8 +460,7 @@ vec3 pbrPunctual(vec3 diffuseColor, vec3 specularColor,
float metallic, float metallic,
vec3 n, // normal vec3 n, // normal
vec3 v, // surface point to camera vec3 v, // surface point to camera
vec3 l, //surface point to light vec3 l) //surface point to light
out vec3 specContrib) //specular contribution (exposed to alpha shaders to calculate "glare")
{ {
// make sure specular highlights from punctual lights don't fall off of polished surfaces // make sure specular highlights from punctual lights don't fall off of polished surfaces
perceptualRoughness = max(perceptualRoughness, MIN_PBR_ROUGHNESS); perceptualRoughness = max(perceptualRoughness, MIN_PBR_ROUGHNESS);
...@@ -524,28 +508,13 @@ vec3 pbrPunctual(vec3 diffuseColor, vec3 specularColor, ...@@ -524,28 +508,13 @@ vec3 pbrPunctual(vec3 diffuseColor, vec3 specularColor,
// Calculation of analytical lighting contribution // Calculation of analytical lighting contribution
vec3 diffuseContrib = (1.0 - F) * diffuse(pbrInputs); vec3 diffuseContrib = (1.0 - F) * diffuse(pbrInputs);
specContrib = F * G * D / (4.0 * NdotL * NdotV); vec3 specContrib = F * G * D / (4.0 * NdotL * NdotV);
// Obtain final intensity as reflectance (BRDF) scaled by the energy of the light (cosine law) // Obtain final intensity as reflectance (BRDF) scaled by the energy of the light (cosine law)
vec3 color = NdotL * (diffuseContrib + specContrib); vec3 color = NdotL * (diffuseContrib + specContrib);
specContrib *= NdotL;
specContrib = max(specContrib, vec3(0));
return clamp(color, vec3(0), vec3(10)); return clamp(color, vec3(0), vec3(10));
} }
vec3 pbrPunctual(vec3 diffuseColor, vec3 specularColor,
float perceptualRoughness,
float metallic,
vec3 n, // normal
vec3 v, // surface point to camera
vec3 l) //surface point to light
{
vec3 specContrib;
return pbrPunctual(diffuseColor, specularColor, perceptualRoughness, metallic, n, v, l, specContrib);
}
void calcDiffuseSpecular(vec3 baseColor, float metallic, inout vec3 diffuseColor, inout vec3 specularColor) void calcDiffuseSpecular(vec3 baseColor, float metallic, inout vec3 diffuseColor, inout vec3 specularColor)
{ {
vec3 f0 = vec3(0.04); vec3 f0 = vec3(0.04);
...@@ -554,31 +523,22 @@ void calcDiffuseSpecular(vec3 baseColor, float metallic, inout vec3 diffuseColor ...@@ -554,31 +523,22 @@ void calcDiffuseSpecular(vec3 baseColor, float metallic, inout vec3 diffuseColor
specularColor = mix(f0, baseColor, metallic); specularColor = mix(f0, baseColor, metallic);
} }
vec3 pbrBaseLight(vec3 diffuseColor, vec3 specularColor, float metallic, vec3 v, vec3 norm, float perceptualRoughness, vec3 light_dir, vec3 sunlit, float scol, vec3 radiance, vec3 irradiance, vec3 colorEmissive, float ao, vec3 additive, vec3 atten, out vec3 specContrib) vec3 pbrBaseLight(vec3 diffuseColor, vec3 specularColor, float metallic, vec3 v, vec3 norm, float perceptualRoughness, vec3 light_dir, vec3 sunlit, float scol, vec3 radiance, vec3 irradiance, vec3 colorEmissive, float ao, vec3 additive, vec3 atten)
{ {
perceptualRoughness = max(perceptualRoughness, MIN_PBR_ROUGHNESS); perceptualRoughness = max(perceptualRoughness, MIN_PBR_ROUGHNESS);
vec3 color = vec3(0); vec3 color = vec3(0);
float NdotV = clamp(abs(dot(norm, v)), 0.001, 1.0); float NdotV = clamp(abs(dot(norm, v)), 0.001, 1.0);
vec3 ibl_spec; color += pbrIbl(diffuseColor, specularColor, radiance, irradiance, ao, NdotV, perceptualRoughness);
color += pbrIbl(diffuseColor, specularColor, radiance, irradiance, ao, NdotV, perceptualRoughness, ibl_spec);
color += pbrPunctual(diffuseColor, specularColor, perceptualRoughness, metallic, norm, v, normalize(light_dir), specContrib) * sunlit * 3.0 * scol; //magic number to balance with legacy materials color += pbrPunctual(diffuseColor, specularColor, perceptualRoughness, metallic, norm, v, normalize(light_dir)) * sunlit * 3.0 * scol; //magic number to balance with legacy materials
specContrib *= sunlit * 2.75 * scol;
specContrib += ibl_spec;
color += colorEmissive; color += colorEmissive;
return color; return color;
} }
vec3 pbrBaseLight(vec3 diffuseColor, vec3 specularColor, float metallic, vec3 v, vec3 norm, float perceptualRoughness, vec3 light_dir, vec3 sunlit, float scol, vec3 radiance, vec3 irradiance, vec3 colorEmissive, float ao, vec3 additive, vec3 atten)
{
vec3 specContrib;
return pbrBaseLight(diffuseColor, specularColor, metallic, v, norm, perceptualRoughness, light_dir, sunlit, scol, radiance, irradiance, colorEmissive, ao, additive, atten, specContrib);
}
uniform vec4 waterPlane; uniform vec4 waterPlane;
uniform float waterSign; uniform float waterSign;
......
...@@ -112,16 +112,14 @@ vec3 pbrBaseLight(vec3 diffuseColor, ...@@ -112,16 +112,14 @@ vec3 pbrBaseLight(vec3 diffuseColor,
vec3 colorEmissive, vec3 colorEmissive,
float ao, float ao,
vec3 additive, vec3 additive,
vec3 atten, vec3 atten);
out vec3 specContrib);
vec3 pbrPunctual(vec3 diffuseColor, vec3 specularColor, vec3 pbrPunctual(vec3 diffuseColor, vec3 specularColor,
float perceptualRoughness, float perceptualRoughness,
float metallic, float metallic,
vec3 n, // normal vec3 n, // normal
vec3 v, // surface point to camera vec3 v, // surface point to camera
vec3 l, //surface point to light vec3 l); //surface point to light
out vec3 specContrib);
vec3 calcPointLightOrSpotLight(vec3 diffuseColor, vec3 specularColor, vec3 calcPointLightOrSpotLight(vec3 diffuseColor, vec3 specularColor,
float perceptualRoughness, float perceptualRoughness,
...@@ -132,7 +130,7 @@ vec3 calcPointLightOrSpotLight(vec3 diffuseColor, vec3 specularColor, ...@@ -132,7 +130,7 @@ vec3 calcPointLightOrSpotLight(vec3 diffuseColor, vec3 specularColor,
vec3 lp, // light position vec3 lp, // light position
vec3 ld, // light direction (for spotlights) vec3 ld, // light direction (for spotlights)
vec3 lightColor, vec3 lightColor,
float lightSize, float falloff, float is_pointlight, inout float glare, float ambiance) float lightSize, float falloff, float is_pointlight, float ambiance)
{ {
vec3 color = vec3(0,0,0); vec3 color = vec3(0,0,0);
...@@ -154,10 +152,7 @@ vec3 calcPointLightOrSpotLight(vec3 diffuseColor, vec3 specularColor, ...@@ -154,10 +152,7 @@ vec3 calcPointLightOrSpotLight(vec3 diffuseColor, vec3 specularColor,
vec3 intensity = spot_atten * dist_atten * lightColor * 3.0; //magic number to balance with legacy materials vec3 intensity = spot_atten * dist_atten * lightColor * 3.0; //magic number to balance with legacy materials
vec3 speccol; color = intensity*pbrPunctual(diffuseColor, specularColor, perceptualRoughness, metallic, n.xyz, v, lv);
color = intensity*pbrPunctual(diffuseColor, specularColor, perceptualRoughness, metallic, n.xyz, v, lv, speccol);
speccol *= intensity;
glare += max(max(speccol.r, speccol.g), speccol.b);
} }
return color; return color;
...@@ -166,7 +161,6 @@ vec3 calcPointLightOrSpotLight(vec3 diffuseColor, vec3 specularColor, ...@@ -166,7 +161,6 @@ vec3 calcPointLightOrSpotLight(vec3 diffuseColor, vec3 specularColor,
void main() void main()
{ {
vec3 color = vec3(0,0,0); vec3 color = vec3(0,0,0);
float glare = 0.0;
vec3 light_dir = (sun_up_factor == 1) ? sun_dir : moon_dir; vec3 light_dir = (sun_up_factor == 1) ? sun_dir : moon_dir;
vec3 pos = vary_position; vec3 pos = vary_position;
...@@ -232,9 +226,7 @@ void main() ...@@ -232,9 +226,7 @@ void main()
vec3 v = -normalize(pos.xyz); vec3 v = -normalize(pos.xyz);
vec3 spec; color = pbrBaseLight(diffuseColor, specularColor, metallic, v, norm.xyz, perceptualRoughness, light_dir, sunlit_linear, scol, radiance, irradiance, colorEmissive, ao, additive, atten);
color = pbrBaseLight(diffuseColor, specularColor, metallic, v, norm.xyz, perceptualRoughness, light_dir, sunlit_linear, scol, radiance, irradiance, colorEmissive, ao, additive, atten, spec);
glare += max(max(spec.r, spec.g), spec.b);
color.rgb = atmosFragLightingLinear(color.rgb, additive, atten); color.rgb = atmosFragLightingLinear(color.rgb, additive, atten);
...@@ -246,7 +238,7 @@ void main() ...@@ -246,7 +238,7 @@ void main()
vec3 light = vec3(0); vec3 light = vec3(0);
// Punctual lights // Punctual lights
#define LIGHT_LOOP(i) light += calcPointLightOrSpotLight(diffuseColor, specularColor, perceptualRoughness, metallic, norm.xyz, pos.xyz, v, light_position[i].xyz, light_direction[i].xyz, light_diffuse[i].rgb, light_deferred_attenuation[i].x, light_deferred_attenuation[i].y, light_attenuation[i].z, glare, light_attenuation[i].w); #define LIGHT_LOOP(i) light += calcPointLightOrSpotLight(diffuseColor, specularColor, perceptualRoughness, metallic, norm.xyz, pos.xyz, v, light_position[i].xyz, light_direction[i].xyz, light_diffuse[i].rgb, light_deferred_attenuation[i].x, light_deferred_attenuation[i].y, light_attenuation[i].z, light_attenuation[i].w);
LIGHT_LOOP(1) LIGHT_LOOP(1)
LIGHT_LOOP(2) LIGHT_LOOP(2)
...@@ -261,9 +253,6 @@ void main() ...@@ -261,9 +253,6 @@ void main()
float a = basecolor.a*vertex_color.a; float a = basecolor.a*vertex_color.a;
glare = min(glare, 1.0);
a = max(a, glare);
frag_color = max(vec4(color.rgb,a), vec4(0)); frag_color = max(vec4(color.rgb,a), vec4(0));
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment