UltimateZoneBuilder/Source/Native/ShaderDisplay2D.h

144 lines
2.8 KiB
C

#pragma once
static const char* display2D_vs = R"(
in vec3 AttrPosition;
in vec4 AttrColor;
in vec2 AttrUV;
out vec4 Color;
out vec2 UV;
uniform mat4 projection;
void main()
{
gl_Position = projection * vec4(AttrPosition, 1.0);
Color = AttrColor;
UV = AttrUV;
}
)";
static const char* display2D_ps_fsaa = R"(
in vec4 Color;
in vec2 UV;
out vec4 FragColor;
// Render settings
// x = texel width
// y = texel height
// z = FSAA blend factor
// w = transparency
uniform vec4 rendersettings;
uniform float desaturation;
uniform sampler2D texture1;
uniform vec4 texturefactor;
// This blends the max of 2 pixels
vec4 addcolor(vec4 c1, vec4 c2)
{
return vec4(
max(c1.r, c2.r),
max(c1.g, c2.g),
max(c1.b, c2.b),
clamp(c1.a + c2.a * 0.5, 0.0, 1.0));
}
vec3 desaturate(vec3 texel)
{
float gray = (texel.r * 0.3 + texel.g * 0.56 + texel.b * 0.14);
return mix(texel, vec3(gray), desaturation);
}
void main()
{
vec4 c = texture(texture1, UV);
// If this pixel is not drawn on...
if(c.a < 0.1)
{
// Mix the colors of nearby pixels
vec4 n = vec4(0.0);
n = addcolor(n, texture(texture1, vec2(UV.x + rendersettings.x, UV.y)));
n = addcolor(n, texture(texture1, vec2(UV.x - rendersettings.x, UV.y)));
n = addcolor(n, texture(texture1, vec2(UV.x, UV.y + rendersettings.y)));
n = addcolor(n, texture(texture1, vec2(UV.x, UV.y - rendersettings.y)));
FragColor = vec4(desaturate(n.rgb), n.a * rendersettings.z * rendersettings.w);
}
else
{
FragColor = vec4(desaturate(c.rgb), c.a * rendersettings.w) * Color;
}
FragColor *= texturefactor;
#if defined(ALPHA_TEST)
if (FragColor.a < 0.5) discard;
#endif
}
)";
const char* display2D_ps_normal = R"(
in vec4 Color;
in vec2 UV;
out vec4 FragColor;
// Render settings
// x = texel width
// y = texel height
// z = FSAA blend factor
// w = transparency
uniform vec4 rendersettings;
uniform float desaturation;
uniform sampler2D texture1;
uniform vec4 texturefactor;
vec3 desaturate(vec3 texel)
{
float gray = (texel.r * 0.3 + texel.g * 0.56 + texel.b * 0.14);
return mix(texel, vec3(gray), desaturation);
}
void main()
{
vec4 c = texture(texture1, UV);
FragColor = vec4(desaturate(c.rgb), c.a * rendersettings.w) * Color;
FragColor *= texturefactor;
#if defined(ALPHA_TEST)
if (FragColor.a < 0.5) discard;
#endif
}
)";
const char* display2D_ps_fullbright = R"(
in vec4 Color;
in vec2 UV;
out vec4 FragColor;
// Render settings
// x = texel width
// y = texel height
// z = FSAA blend factor
// w = transparency
uniform vec4 rendersettings;
uniform sampler2D texture1;
uniform vec4 texturefactor;
void main()
{
vec4 c = texture(texture1, UV);
FragColor = vec4(c.rgb, c.a * rendersettings.w);
FragColor *= texturefactor;
#if defined(ALPHA_TEST)
if (FragColor.a < 0.5) discard;
#endif
}
)";