Workbench: Linear => srgb conversion
This commit is contained in:
@@ -33,3 +33,20 @@ vec2 normal_encode(vec3 n)
|
||||
float p = sqrt(n.z * 8.0 + 8.0);
|
||||
return vec2(n.xy / p + 0.5);
|
||||
}
|
||||
|
||||
/* Linear to srgb conversion */
|
||||
const float SRGB_ALPHA = 0.055;
|
||||
float linear_to_srgb(float channel) {
|
||||
if(channel <= 0.0031308) {
|
||||
return 12.92 * channel;
|
||||
} else {
|
||||
return (1.0 + SRGB_ALPHA) * pow(channel, 1.0/2.4) - SRGB_ALPHA;
|
||||
}
|
||||
}
|
||||
vec3 linearrgb_to_srgb(vec3 rgb) {
|
||||
return vec3(
|
||||
linear_to_srgb(rgb.r),
|
||||
linear_to_srgb(rgb.g),
|
||||
linear_to_srgb(rgb.b)
|
||||
);
|
||||
}
|
||||
@@ -22,7 +22,7 @@ void main()
|
||||
|
||||
#ifndef V3D_DRAWOPTION_OBJECT_OVERLAP
|
||||
if (depth == 1.0) {
|
||||
fragColor = vec4(background_color(world_data, uv_viewport.y), 0.0);
|
||||
fragColor = vec4(linearrgb_to_srgb(background_color(world_data, uv_viewport.y)), 0.0);
|
||||
return;
|
||||
}
|
||||
#else /* !V3D_DRAWOPTION_OBJECT_OVERLAP */
|
||||
@@ -32,9 +32,9 @@ void main()
|
||||
if (object_id == NO_OBJECT_ID) {
|
||||
vec3 background = background_color(world_data, uv_viewport.y);
|
||||
if (object_overlap == 0.0) {
|
||||
fragColor = vec4(background, 0.0);
|
||||
fragColor = vec4(linearrgb_to_srgb(background), 0.0);
|
||||
} else {
|
||||
fragColor = vec4(mix(objectOverlapColor, background, object_overlap), 1.0-object_overlap);
|
||||
fragColor = vec4(linearrgb_to_srgb(mix(objectOverlapColor, background, object_overlap)), 1.0-object_overlap);
|
||||
}
|
||||
return;
|
||||
}
|
||||
@@ -64,5 +64,5 @@ void main()
|
||||
shaded_color = mix(objectOverlapColor, shaded_color, object_overlap);
|
||||
#endif /* V3D_DRAWOPTION_OBJECT_OVERLAP */
|
||||
|
||||
fragColor = vec4(shaded_color, 1.0);
|
||||
fragColor = vec4(linearrgb_to_srgb(shaded_color), 1.0);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user