#version 450 core
layout(location = 0) in vec2 position;
layout(location = 1) in vec2 uv;
layout(location = 2) in vec4 color;
layout(push_constant) uniform uPushConstant {
vec2 scale;
vec2 translate;
bool is_srgb;
} pc;
out gl_PerVertex {
vec4 gl_Position;
};
layout(location = 0) out struct {
vec4 color;
vec2 uv;
} vert_out;
vec4 srgb_to_linear(vec4 srgb) {
vec3 color_srgb = srgb.rgb;
vec3 selector = ceil(color_srgb - 0.04045); // 0 if under value, 1 if over
vec3 under = color_srgb / 12.92;
vec3 over = pow((color_srgb + 0.055) / 1.055, vec3(2.4));
vec3 result = mix(under, over, selector);
return vec4(result, srgb.a);
}
void main() {
if (pc.is_srgb) {
vert_out.color = color;
} else {
vert_out.color = srgb_to_linear(color);
}
vert_out.uv = uv;
gl_Position = vec4(position * pc.scale + pc.translate, 0, 1);
}