You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GLSL着色器绘图线条厚度不均:归一化后失真问题求助

图形绘制着色器线条厚度不一致问题

编写简单的图形绘制着色器时遇到线条厚度无法保持一致的问题:

  • 不归一化时,数值差较小的区域线条偏厚
  • 归一化后,图形出现严重失真

着色器代码

#version 460 core

layout(location = 0) out vec4 color;

in vec4 gl_FragCoord;

uniform vec2 Screen_Size;
uniform vec2 zoom;
uniform vec2 offset;
#define GRAPHCOLOR vec3(0.176, 0.439, 0.701)

float leftside(vec2 pos) {
    return(pos.y);
}
float rightside(vec2 pos) {
    return(pos.x);
}
vec2 cameramat(vec2 pos) {
    return((pos - offset) * zoom);
}
void main() {
    float eps = (50.0*sqrt(zoom.x*zoom.y)) / 2000.0;
    vec2 pos = cameramat(2.0 * (gl_FragCoord.xy / Screen_Size) - vec2(1, 1));
    vec3 _color = vec3(0.9, 0.9, 0.9);
    vec2 sides = (vec2(leftside(pos), rightside(pos)));

    _color = mix(_color, vec3(0.70), step(abs(pos.x - float(int(pos.x))), 0.002 * zoom.x));
    _color = mix(_color, vec3(0.70), step(abs(pos.y - float(int(pos.y))), 0.002 * zoom.y));

    _color = mix(_color, vec3(0.4), step(abs(pos.x), 0.002 * zoom.x));
    _color = mix(_color, vec3(0.4), step(abs(pos.y), 0.0025 * zoom.y));

    _color = mix(_color, mix(_color, GRAPHCOLOR, step(abs((sides.x - sides.y)), eps / 2)),smoothstep(eps, 0, abs((sides.x - sides.y))));

    color = vec4(_color, 0.9);
}

示例图形

未归一化 x = y未归一化 50x = 50y未归一化 x = y归一化 50x = 50y
未归一化x=y未归一化50x=50y未归一化x=y归一化50x=50y

项目信息

完整项目为github上的graphcalc仓库

内容的提问来源于stack exchange,提问作者urisinger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 20:42:41