mirror of
https://gitlab.freedesktop.org/wlroots/wlroots.git
synced 2026-04-19 06:47:02 -04:00
wip: render/gles2: add support for 3D LUT transforms
This commit is contained in:
parent
451327d6b4
commit
ddd47368f3
3 changed files with 84 additions and 11 deletions
|
|
@ -4,7 +4,11 @@
|
|||
#define SOURCE_TEXTURE_RGBX 3
|
||||
#define SOURCE_TEXTURE_EXTERNAL 4
|
||||
|
||||
#if !defined(SOURCE)
|
||||
/* enum wlr_gles2_color_transform */
|
||||
#define COLOR_TRANSFORM_IDENTITY 0
|
||||
#define COLOR_TRANSFORM_LUT_3D 1
|
||||
|
||||
#if !defined(SOURCE) || !defined(COLOR_TRANSFORM)
|
||||
#error "Missing shader preamble"
|
||||
#endif
|
||||
|
||||
|
|
@ -12,6 +16,10 @@
|
|||
#extension GL_OES_EGL_image_external : require
|
||||
#endif
|
||||
|
||||
#if COLOR_TRANSFORM == COLOR_TRANSFORM_3DLUT
|
||||
#extension GL_OES_texture_3D : require
|
||||
#endif
|
||||
|
||||
precision mediump float;
|
||||
|
||||
varying vec2 v_texcoord;
|
||||
|
|
@ -30,6 +38,12 @@ uniform float alpha;
|
|||
const float alpha = 1.0;
|
||||
#endif
|
||||
|
||||
#if COLOR_TRANSFORM == COLOR_TRANSFORM_LUT_3D
|
||||
uniform mediump sampler3D lut_3d;
|
||||
uniform float lut_3d_offset;
|
||||
uniform float lut_3d_scale;
|
||||
#endif
|
||||
|
||||
vec4 sample_texture() {
|
||||
#if SOURCE == SOURCE_TEXTURE_RGBA || SOURCE == SOURCE_TEXTURE_EXTERNAL
|
||||
return texture2D(tex, v_texcoord);
|
||||
|
|
@ -40,6 +54,30 @@ vec4 sample_texture() {
|
|||
#endif
|
||||
}
|
||||
|
||||
void main() {
|
||||
gl_FragColor = sample_texture() * alpha;
|
||||
vec4 transform_color(vec4 color) {
|
||||
#if COLOR_TRANSFORM == COLOR_TRANSFORM_IDENTITY
|
||||
return color;
|
||||
#elif COLOR_TRANSFORM == COLOR_TRANSFORM_LUT_3D
|
||||
vec3 pos = lut_3d_offset + color * lut_3d_scale;
|
||||
return texture3D(lut_3d, pos).rgb;
|
||||
#endif
|
||||
}
|
||||
|
||||
void main() {
|
||||
vec4 color = sample_texture() * alpha;
|
||||
|
||||
#if COLOR_TRANSFORM != COLOR_TRANSFORM_IDENTITY
|
||||
// Convert from pre-multiplied alpha to straight alpha
|
||||
if (color.a == 0.0)
|
||||
color.rgb = vec3(0.0, 0.0, 0.0);
|
||||
else
|
||||
color.rgb /= color.a;
|
||||
|
||||
color = transform_color(color);
|
||||
|
||||
// Convert from straight alpha to pre-multiplied alpha
|
||||
color.rgb *= color.a;
|
||||
#endif
|
||||
|
||||
gl_FragColor = color;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue