Path: blob/master/drivers/gles3/shaders/tex_blit.glsl
21733 views
/* clang-format off */
#[modes]
mode_default =
#[specializations]
USE_OUTPUT1 = true
USE_OUTPUT2 = true
USE_OUTPUT3 = true
#[vertex]
layout(location = 0) in vec2 vertex_attrib;
uniform vec2 offset;
uniform vec2 size;
out vec2 uv;
void main() {
uv = vertex_attrib * 0.5 + 0.5;
// This math scales the Vertex Attribute Quad to match the Rect the user passed in, based on Offset & Size
gl_Position = vec4( (offset * 2.0 - 1.0) + (size * (vertex_attrib + 1.0)), 1.0, 1.0);
}
#[fragment]
uniform sampler2D source0; // texunit:0
uniform sampler2D source1; // texunit:-1
uniform sampler2D source2; // texunit:-2
uniform sampler2D source3; // texunit:-3
#define OUTPUT0_SRGB uint(1)
#define OUTPUT1_SRGB uint(2)
#define OUTPUT2_SRGB uint(4)
#define OUTPUT3_SRGB uint(8)
uniform uint convert_to_srgb;
uniform vec4 modulate;
uniform float time;
in vec2 uv;
layout (location = 0) out vec4 out_color0;
#ifdef USE_OUTPUT1
layout (location = 1) out vec4 out_color1;
#endif
#ifdef USE_OUTPUT2
layout (location = 2) out vec4 out_color2;
#endif
#ifdef USE_OUTPUT3
layout (location = 3) out vec4 out_color3;
#endif
// This needs to be outside clang-format so the ubo comment is in the right place
#ifdef MATERIAL_UNIFORMS_USED
layout(std140) uniform MaterialUniforms{ //ubo:0
#MATERIAL_UNIFORMS
};
#endif
#GLOBALS
vec3 linear_to_srgb(vec3 color) {
// If going to srgb, clamp from 0 to 1.
color = clamp(color, vec3(0.0), vec3(1.0));
const vec3 a = vec3(0.055f);
return mix((vec3(1.0f) + a) * pow(color.rgb, vec3(1.0f / 2.4f)) - a, 12.92f * color.rgb, lessThan(color.rgb, vec3(0.0031308f)));
}
void main() {
// Handles the case where user code uses extra outputs, but extra output targets were not bound
vec4 color0 = vec4(0.0, 0.0, 0.0, 1.0);
vec4 color1 = vec4(0.0, 0.0, 0.0, 1.0);
vec4 color2 = vec4(0.0, 0.0, 0.0, 1.0);
vec4 color3 = vec4(0.0, 0.0, 0.0, 1.0);
#CODE : BLIT
// Discards extra outputs if extra output targets were not bound
out_color0 = color0;
#ifdef USE_OUTPUT1
out_color1 = color1;
#endif
#ifdef USE_OUTPUT2
out_color2 = color2;
#endif
#ifdef USE_OUTPUT3
out_color3 = color3;
#endif
if (bool(convert_to_srgb & OUTPUT0_SRGB)) {
out_color0.rgb = linear_to_srgb(out_color0.rgb); // Regular linear -> SRGB conversion.
}
#ifdef USE_OUTPUT1
if (bool(convert_to_srgb & OUTPUT1_SRGB)) {
out_color1.rgb = linear_to_srgb(out_color1.rgb);
}
#endif
#ifdef USE_OUTPUT2
if (bool(convert_to_srgb & OUTPUT2_SRGB)) {
out_color2.rgb = linear_to_srgb(out_color2.rgb);
}
#endif
#ifdef USE_OUTPUT3
if (bool(convert_to_srgb & OUTPUT3_SRGB)) {
out_color3.rgb = linear_to_srgb(out_color3.rgb);
}
#endif
}