engine/bin/data/shaders/gui/gui.frag.h

52 lines
1.6 KiB
C

#define TEXTURES 1
#define CUBEMAPS 1
#define DEFERRED_SAMPLING 0
#include "../common/macros.h"
#include "../common/structs.h"
#include "../common/functions.h"
#include "./gui.h"
layout (binding = 1) uniform sampler2D samplerTexture;
layout (location = 0) in vec2 inUv;
layout (location = 1) in flat Gui inGui;
layout (location = 7) in flat Glyph inGlyph;
layout (location = 0) out uvec2 outId;
layout (location = 1) out vec2 outNormals;
#if DEFERRED_SAMPLING
layout (location = 2) out vec4 outUvs;
#else
layout (location = 2) out vec4 outAlbedo;
#endif
void main() {
if ( inUv.x < inGui.offset.x || inUv.y < inGui.offset.y || inUv.x > inGui.offset.z || inUv.y > inGui.offset.w ) discard;
const vec2 uv = inUv.xy;
const float mip = mipLevel(dFdx(inUv), dFdy(inUv));
vec4 C = inGui.color;
#if GLYPH
if ( enabled(inGui.mode, 1) ) {
outAlbedo = inGui.color;
return;
}
const float sampled = texture(samplerTexture, inUv).r;
if ( enabled(inGui.mode, 2) ) {
const float smoothing = ( inGlyph.spread > 0 && inGlyph.scale > 0 ) ? 0.25 / (inGlyph.spread * inGlyph.scale) : 0.25 / (4 * 1.5);
const float outlining = smoothstep(0.5 - smoothing, 0.5 + smoothing, sampled);
const float alpha = smoothstep(inGlyph.weight - smoothing, inGlyph.weight + smoothing, sampled);
if ( alpha < 0.001 || alpha > 1 ) discard;
C = mix(inGlyph.stroke, inGui.color, outlining);
C.a = inGui.color.a * alpha;
} else {
if ( sampled < 0.001 || sampled > 1 ) discard;
C *= sampled;
}
#else
if ( enabled(inGui.mode, 0) ) C = inGui.color;
else C *= textureLod( samplerTexture, uv, mip );
#endif
outAlbedo = C;
}