【发布时间】:2022-09-05 17:22:48
【问题描述】:
我正在学习如何在 glsl 中使用着色器产生噪音,并将以下片段着色器拼凑在一起,这种工作方式:
float rand(vec2 cord)
{
return fract(sin(dot(cord, vec2(12.9898, 78.233)))*43758.5453);
}
void main()
{
vec2 uv = gl_FragCoord.xy;
vec2 i = floor(uv);
vec2 f = fract(uv);
vec2 c0 = i + vec2(0.0,0.0);
vec2 c1 = i + vec2(1.0,0.0);
vec2 c2 = i + vec2(0.0,1.0);
vec2 c3 = i + vec2(1.0,1.0);
float r0 = rand(c0);
float r1 = rand(c1);
float r2 = rand(c2);
float r3 = rand(c3);
float b = mix(r0,r1,f.x);
float t = mix(r2,r3,f.x);
gl_FragColor = vec4(mix(b,t,f.y),0.0,0.0,1.0);
}
(顶点着色器是默认的)
这个想法是在整数点处随机生成一些值,然后在它们之间进行插值。这个过程大部分都有效,但在整数值边界处留下了一些尖锐的线条。
如果我不得不猜测,我认为这与舍入误差有关。 rand 函数的想法是生成一个介于 1 和 0 之间的值,该值随 2D 位置变化很大,它做得很好,以至于舍入的微小差异会导致整数点的变化更大。
所以我的问题是,如果这是对问题的正确识别,我该如何解决?如果这不正确,我如何更好地识别问题。
谢谢。
【问题讨论】:
标签: glsl fragment-shader