我想在GLSL中画一个平滑的圆,但有一个可变宽度的边框,用一种单独的颜色。潜在地,圆的内部可能是透明的。
我的原始非平滑着色器:
#version 330
layout(location=0) out vec4 frag_colour;
in vec4 color;
uniform float radius;
uniform vec2 position;
uniform vec4 borderColor;
uniform float borderThickness;
void main()
{
float distanceX = abs(gl_FragCoord.x - position.x);
float distanceY = abs(gl_FragCoord.y - position.y);
if(sqrt(distanceX * distanceX + distanceY * distanceY) > radius)
discard;
else if(sqrt(distanceX * distanceX + distanceY * distanceY) <= radius &&
sqrt(distanceX * distanceX + distanceY * distanceY) >= radius-borderThickness)
frag_colour = borderColor;
else
frag_colour = color;
}
这是可行的,但并不顺利。我可以画出平滑的圆圈:
#version 330
layout(location=0) out vec4 frag_colour;
in vec4 color;
uniform float radius;
uniform vec2 position;
uniform vec4 borderColor;
uniform float borderThickness;
void main()
{
vec2 uv = gl_FragCoord.xy - position;
float d = sqrt(dot(uv,uv));
float t = 1.0 - smoothstep(radius-borderThickness,radius, d);
frag_colour = vec4(color.rgb,color.a*t);
}
但是我不知道如何在上面添加我的边框。
回答开始:得票数 1您必须计算半径和距离之差的绝对值,并在0.0和borderThickness
之间进行插值
float t = 1.0 - smoothstep(0.0, borderThickness, abs(radius-d));
如果你想填充这个圆,那么你需要2个渐变。1用于内圆和边界之间的过渡,第二个用于轮廓上的alpha通道。通过前者设置颜色,并通过后者设置mix
通道:
float t1 = 1.0 - smoothstep(radius-borderThickness, radius, d);
float t2 = 1.0 - smoothstep(radius, radius+borderThickness, d);
frag_colour = vec4(mix(color.rgb, baseColor.rgb, t1), t2);
总结以上是真正的电脑专家为你收集整理的如何在glsl中绘制带边框的平滑圆圈?的全部内容,希望文章能够帮你解决所遇到的问题。
如果觉得真正的电脑专家网站内容还不错,欢迎将真正的电脑专家推荐给好友。
有话要说...