mirror of
https://gitlab.com/veloren/veloren.git
synced 2024-08-30 18:12:32 +00:00
33 lines
1.5 KiB
GLSL
33 lines
1.5 KiB
GLSL
//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);
|
||
}
|
||
|
||
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))
|
||
);
|
||
}
|
||
|
||
// 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) {
|
||
float ndotL = max(dot(norm, -light_dir), 0.0);
|
||
//if (ndotL > 0.0/* && dot(s_norm, -light_dir) > 0.0*/) {
|
||
vec3 H = normalize(-light_dir + dir);
|
||
// (k_d * (L ⋅ N) + k_s * (R ⋅ V)^α)
|
||
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);
|
||
}
|