2019-08-04 19:54:08 +00:00
|
|
|
|
//https://gamedev.stackexchange.com/questions/92015/optimized-linear-to-srgb-glsl
|
|
|
|
|
vec3 srgb_to_linear(vec3 srgb) {
|
|
|
|
|
bvec3 cutoff = lessThan(srgb, vec3(0.04045));
|
|
|
|
|
vec3 higher = pow((srgb + vec3(0.055))/vec3(1.055), vec3(2.4));
|
|
|
|
|
vec3 lower = srgb/vec3(12.92);
|
|
|
|
|
|
|
|
|
|
return mix(higher, lower, cutoff);
|
2020-04-04 00:32:39 +00:00
|
|
|
|
}
|
|
|
|
|
|
2020-04-12 22:29:59 +00:00
|
|
|
|
vec3 linear_to_srgb(vec3 col) {
|
|
|
|
|
vec3 s1 = vec3(sqrt(col.r), sqrt(col.g), sqrt(col.b));
|
|
|
|
|
vec3 s2 = vec3(sqrt(s1.r), sqrt(s1.g), sqrt(s1.b));
|
|
|
|
|
vec3 s3 = vec3(sqrt(s2.r), sqrt(s2.g), sqrt(s2.b));
|
|
|
|
|
return vec3(
|
|
|
|
|
mix(11.500726 * col.r, (0.585122381 * s1.r + 0.783140355 * s2.r - 0.368262736 * s3.r), clamp((col.r - 0.0060) * 10000.0, 0.0, 1.0)),
|
|
|
|
|
mix(11.500726 * col.g, (0.585122381 * s1.g + 0.783140355 * s2.g - 0.368262736 * s3.g), clamp((col.g - 0.0060) * 10000.0, 0.0, 1.0)),
|
|
|
|
|
mix(11.500726 * col.b, (0.585122381 * s1.b + 0.783140355 * s2.b - 0.368262736 * s3.b), clamp((col.b - 0.0060) * 10000.0, 0.0, 1.0))
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
2020-04-04 00:32:39 +00:00
|
|
|
|
// Phong reflection.
|
|
|
|
|
//
|
|
|
|
|
// Note: norm, dir, light_dir must all be normalizd.
|
|
|
|
|
vec3 light_reflection_factor(vec3 norm, vec3 dir, vec3 light_dir, vec3 k_d, vec3 k_s, float alpha) {
|
2020-04-09 00:38:40 +00:00
|
|
|
|
float ndotL = max(dot(norm, -light_dir), 0.0);
|
2020-04-12 22:29:59 +00:00
|
|
|
|
//if (ndotL > 0.0/* && dot(s_norm, -light_dir) > 0.0*/) {
|
|
|
|
|
vec3 H = normalize(-light_dir + dir);
|
2020-04-04 00:32:39 +00:00
|
|
|
|
// (k_d * (L ⋅ N) + k_s * (R ⋅ V)^α)
|
2020-04-12 22:29:59 +00:00
|
|
|
|
return k_d * ndotL + mix(k_s * pow(max(dot(norm, H), 0.0), alpha * 4.0), vec3(0.0), bvec3(ndotL == 0.0));
|
|
|
|
|
// }
|
|
|
|
|
// return vec3(0.0);
|
2020-04-04 00:32:39 +00:00
|
|
|
|
}
|