fixed colour space issues
This commit is contained in:
parent
11249419c7
commit
ccb7ab8444
|
@ -35,7 +35,7 @@ uniform vec3 camera_pos;
|
||||||
|
|
||||||
uniform int lights_count;
|
uniform int lights_count;
|
||||||
|
|
||||||
vec3 fresnelSchlick(float cosTheta, vec3 F0)
|
vec3 FresnelSchlick(float cosTheta, vec3 F0)
|
||||||
{
|
{
|
||||||
return F0 + (1.0 - F0) * pow(clamp(1.0 - cosTheta, 0.0, 1.0), 5.0);
|
return F0 + (1.0 - F0) * pow(clamp(1.0 - cosTheta, 0.0, 1.0), 5.0);
|
||||||
}
|
}
|
||||||
|
@ -64,6 +64,7 @@ float GeometrySchlickGGX(float NdotV, float roughness)
|
||||||
|
|
||||||
return num / denom;
|
return num / denom;
|
||||||
}
|
}
|
||||||
|
|
||||||
float GeometrySmith(vec3 N, vec3 V, vec3 L, float roughness)
|
float GeometrySmith(vec3 N, vec3 V, vec3 L, float roughness)
|
||||||
{
|
{
|
||||||
float NdotV = max(dot(N, V), 0.0);
|
float NdotV = max(dot(N, V), 0.0);
|
||||||
|
@ -74,9 +75,44 @@ float GeometrySmith(vec3 N, vec3 V, vec3 L, float roughness)
|
||||||
return ggx1 * ggx2;
|
return ggx1 * ggx2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
float LinRGB_To_sRGB(float c)
|
||||||
|
{
|
||||||
|
if (c < 0.0031308f) {
|
||||||
|
return (c < 0.0f) ? 0.0f : c * 12.92f;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1.055f * pow(c, 1.0f / 2.4f) - 0.055f;
|
||||||
|
}
|
||||||
|
|
||||||
|
vec3 LinRGB_To_sRGB(vec3 c)
|
||||||
|
{
|
||||||
|
c.r = LinRGB_To_sRGB(c.r);
|
||||||
|
c.g = LinRGB_To_sRGB(c.g);
|
||||||
|
c.b = LinRGB_To_sRGB(c.b);
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
float sRGB_To_LinRGB(float c)
|
||||||
|
{
|
||||||
|
if (c < 0.04045f) {
|
||||||
|
return (c < 0.0f) ? 0.0f : c * (1.0f / 12.92f);
|
||||||
|
}
|
||||||
|
|
||||||
|
return pow((c + 0.055f) * (1.0f / 1.055f), 2.4f);
|
||||||
|
}
|
||||||
|
|
||||||
|
vec3 sRGB_To_LinRGB(vec3 c)
|
||||||
|
{
|
||||||
|
c.r = sRGB_To_LinRGB(c.r);
|
||||||
|
c.g = sRGB_To_LinRGB(c.g);
|
||||||
|
c.b = sRGB_To_LinRGB(c.b);
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
vec4 albedo = texture2D(frag_tex, vin.tex_pos) * vin.colour;
|
vec4 albedo = texture2D(frag_tex, vin.tex_pos) * vin.colour;
|
||||||
|
vec3 albedo_lin = sRGB_To_LinRGB(albedo.rgb);
|
||||||
|
|
||||||
float roughness = vin.material[0];
|
float roughness = vin.material[0];
|
||||||
float metalness = vin.material[1];
|
float metalness = vin.material[1];
|
||||||
|
@ -86,7 +122,7 @@ void main()
|
||||||
vec3 V = normalize(camera_pos - vin.pos.xyz);
|
vec3 V = normalize(camera_pos - vin.pos.xyz);
|
||||||
|
|
||||||
vec3 F0 = vec3(0.04);
|
vec3 F0 = vec3(0.04);
|
||||||
F0 = mix(F0, albedo.rgb, metalness);
|
F0 = mix(F0, albedo_lin, metalness);
|
||||||
|
|
||||||
vec3 Lo = vec3(0.0);
|
vec3 Lo = vec3(0.0);
|
||||||
for(int i = 0; i < lights_count; i++)
|
for(int i = 0; i < lights_count; i++)
|
||||||
|
@ -103,7 +139,7 @@ void main()
|
||||||
// cook-torrance brdf
|
// cook-torrance brdf
|
||||||
float NDF = DistributionGGX(N, H, roughness);
|
float NDF = DistributionGGX(N, H, roughness);
|
||||||
float G = GeometrySmith(N, V, L, roughness);
|
float G = GeometrySmith(N, V, L, roughness);
|
||||||
vec3 F = fresnelSchlick(max(dot(H, V), 0.0), F0);
|
vec3 F = FresnelSchlick(max(dot(H, V), 0.0), F0);
|
||||||
|
|
||||||
vec3 kS = F;
|
vec3 kS = F;
|
||||||
vec3 kD = vec3(1.0) - kS;
|
vec3 kD = vec3(1.0) - kS;
|
||||||
|
@ -115,14 +151,12 @@ void main()
|
||||||
|
|
||||||
// add to outgoing radiance Lo
|
// add to outgoing radiance Lo
|
||||||
float NdotL = max(dot(N, L), 0.0);
|
float NdotL = max(dot(N, L), 0.0);
|
||||||
Lo += (kD * albedo.rgb / PI + specular) * radiance * NdotL;
|
Lo += (kD * albedo_lin / PI + specular) * radiance * NdotL;
|
||||||
}
|
}
|
||||||
|
|
||||||
vec3 ambient = vec3(0.03f) * albedo.rgb * brightness;
|
vec3 ambient = vec3(0.03f) * albedo_lin * brightness;
|
||||||
vec3 light = ambient + Lo;
|
vec3 light = LinRGB_To_sRGB(ambient + Lo);
|
||||||
|
|
||||||
light = light / (light + vec3(1.f));
|
|
||||||
light = pow(light, vec3(1.f/2.2f));
|
|
||||||
light = light * (1 - luminance) + albedo.rgb * luminance;
|
light = light * (1 - luminance) + albedo.rgb * luminance;
|
||||||
frag_colour = vec4(light, albedo.a);
|
frag_colour = vec4(light, albedo.a);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue