#version 450 layout(set = 0, binding = 0) uniform sampler2D tex; layout(location = 0) in vec2 uv; layout(location = 0) out vec4 out_color; layout(push_constant) uniform UBO { layout(offset = 80) float alpha; } data; layout (constant_id = 0) const int TEXTURE_TRANSFORM = 0; // Matches enum wlr_vk_texture_transform #define TEXTURE_TRANSFORM_IDENTITY 0 #define TEXTURE_TRANSFORM_SRGB 1 float srgb_channel_to_linear(float x) { return mix(x / 12.92, pow((x + 0.055) / 1.055, 2.4), x > 0.04045); } vec3 srgb_color_to_linear(vec3 color) { return vec3( srgb_channel_to_linear(color.r), srgb_channel_to_linear(color.g), srgb_channel_to_linear(color.b) ); } void main() { vec4 in_color = textureLod(tex, uv, 0); if (TEXTURE_TRANSFORM == TEXTURE_TRANSFORM_IDENTITY) { out_color = in_color * data.alpha; return; } // Convert from pre-multiplied alpha to straight alpha float alpha = in_color.a; vec3 rgb; if (alpha == 0) { rgb = vec3(0); } else { rgb = in_color.rgb / alpha; } if (TEXTURE_TRANSFORM == TEXTURE_TRANSFORM_SRGB) { rgb = srgb_color_to_linear(rgb); } // Back to pre-multiplied alpha out_color = vec4(rgb * alpha, alpha); out_color *= data.alpha; }