40 lines
1.0 KiB
GLSL
40 lines
1.0 KiB
GLSL
#version 300 es
|
||
precision highp float;
|
||
|
||
in vec2 v_texCoord;
|
||
in vec4 v_color;
|
||
|
||
uniform sampler2D u_texture;
|
||
uniform float u_opacity;
|
||
uniform float u_sdfThreshold;
|
||
uniform float u_sdfSmoothness;
|
||
uniform vec2 u_textureSize;
|
||
|
||
out vec4 fragColor;
|
||
|
||
void main() {
|
||
// 采样 SDF 纹理(SDF 值存储在 alpha 通道,范围 0-255 已映射到 0-1)
|
||
float sdfValue = texture(u_texture, v_texCoord).a;
|
||
|
||
// 使用 fwidth 计算屏幕空间的变化率
|
||
float fw = fwidth(sdfValue);
|
||
|
||
// 平衡的抗锯齿:根据屏幕空间变化率调整平滑范围
|
||
// 在放大时更平滑,缩小时更锐利
|
||
float smoothRange = max(u_sdfSmoothness, fw * 0.5);
|
||
|
||
// 使用 smoothstep 进行抗锯齿
|
||
float alpha = smoothstep(u_sdfThreshold - smoothRange,
|
||
u_sdfThreshold + smoothRange,
|
||
sdfValue);
|
||
|
||
// 应用颜色和透明度
|
||
fragColor = v_color;
|
||
fragColor.a *= alpha * u_opacity;
|
||
|
||
// 丢弃完全透明的像素
|
||
if (fragColor.a < 0.001) {
|
||
discard;
|
||
}
|
||
}
|