#version 450 #define CP_COUNT 1025 layout(binding = 0) uniform sampler s_sampler; layout(binding = 1) uniform texture2D t_texture; layout(binding = 2) uniform u_gamma_ramp_t { layout(offset = 0) vec4 in_factor; layout(offset = 16) vec4 in_offset; layout(offset = 32) vec4 cp_values[CP_COUNT + 1]; } u_gamma_ramp; layout(location = 0) in vec2 i_texcoord; layout(location = 0) out vec4 o_color; void main() { o_color = texture(sampler2D(t_texture, s_sampler), i_texcoord); vec3 cp_lookup = o_color.rgb; cp_lookup *= u_gamma_ramp.in_factor.rgb; cp_lookup += u_gamma_ramp.in_offset.rgb; cp_lookup = clamp( cp_lookup * float(CP_COUNT - 1), 0.0f, float(CP_COUNT - 1)); vec3 cp_fpart = fract(cp_lookup); ivec3 cp_index = ivec3(cp_lookup); for (int i = 0; i < 3; i++) { int cp_entry = cp_index[i]; float lo = u_gamma_ramp.cp_values[cp_entry + 0][i]; float hi = u_gamma_ramp.cp_values[cp_entry + 1][i]; if (cp_entry == CP_COUNT - 1) hi = lo; o_color[i] = mix(lo, hi, cp_fpart[i]); } }