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
相关产品推荐
相关产品推荐

