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

Shadertoy GLSL求助:V.x==0.6时竖线不显示,代码未达预期

问题解答:Shadertoy中GLSL条件判断的显示差异与坐标范围说明

先还原你的代码:

void mainImage( out vec4 O, vec2 U )
{
   vec2 V = mod(U, 100.);
   O = vec4( V.x == 0.5);
   // O = vec4( V.x == 0.6);
}

一、V.x的取值范围确认

U是Shadertoy传递的片段坐标(对应GPU中的gl_FragCoord.xy),每个像素的中心坐标为半整数(比如左上角第一个像素中心是(0.5, 0.5),右侧相邻像素中心是(1.5, 0.5),以此类推)。因此mod(U.x, 100.)的结果范围是0.5到99.5,取值只能是0.5、1.5、2.5……99.5这类半整数,步长为1.0,既不会是0到100之间的任意小数,更不会是-0.5到0.5。

二、为什么V.x == 0.5能显示竖线,V.x == 0.6不行

因为所有像素的V.x只能取半整数,0.5刚好是其中一个有效值,对应每100像素列的第一个像素中心,判断结果为true,所以显示白色竖线;而0.6不在这些可能的取值里,所有像素的判断结果都是false,vec4(false)等价于黑色透明,自然看不到竖线。

三、解决方法:显示任意位置的竖线

不要用精确相等判断,改用范围匹配来覆盖像素区间。比如要在对应V.x=0.6的位置显示竖线,可以用:

O = vec4( abs(V.x - 0.6) < 0.5 );

这个判断会匹配所有中心坐标距离0.6小于0.5的像素,刚好覆盖1个像素宽度的区域,从而显示竖线。如果需要更粗的线,可将0.5调大(比如1.0对应2个像素宽度)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 20:13:10