我刚遇到这个问题而且我不知道如何看待它。 我想我对它的工作方式有直觉,但我想知道你们中有些人是否可以给我一个答案。
所以,我有一个返回浮点数的函数wave
。
现在,使用以下代码:
vec2 p = ( gl_FragCoord.xy / resolution.xy );
float a;
int steps = 6;
for(int i = 1; i < steps; i++)
{
a = wave(p, i, steps, 0.125, float(steps/2), .7, time / 2., touch);
}
gl_FragColor = vec4(vec3(a*p.x, a*p.y, a * (1. - p.x) ), 1. );
渲染得很好,在另一个之后画一个波浪,从最远和最亮的开始。
但是,如果我这样做:
vec2 p = ( gl_FragCoord.xy / resolution.xy );
float a;
int steps = 6;
a = wave(p, 1, steps, 0.125, float(steps/2), .7, time / 2., touch);
a = wave(p, 2, steps, 0.125, float(steps/2), .7, time / 2., touch);
a = wave(p, 3, steps, 0.125, float(steps/2), .7, time / 2., touch);
a = wave(p, 4, steps, 0.125, float(steps/2), .7, time / 2., touch);
a = wave(p, 5, steps, 0.125, float(steps/2), .7, time / 2., touch);
gl_FragColor = vec4(vec3(a*p.x, a*p.y, a * (1. - p.x) ), 1. );
它将仅绘制最近的波也是最后一波,忽略其他波。 我的经验告诉我,在大多数情况下和编程语言中,上面两个都有些相同。你能告诉我这里有什么区别吗?
波函数:
float wave(vec2 p, int depth, int scale,
float amp, float freq, float wh,
float move, vec2 modif)
{
float a;
float fi = float(depth);
float div_height = 35.;
float m_div = 200./fi;
float m_order_h = fi * .09;
float m_height = wh - m_order_h;
float m_paralax = fi / float(scale);
float m_scale = fi / div_height;
float m_m_var = 50.*fi;
float m_wave = amp*cos(move + m_paralax + p.x*freq);
float s = floor(m_div*(p.x) + m_m_var + move);
float ns = noise2(vec2(s) + modif);
if (p.y < ns*m_scale + m_height + m_wave)
{
a = fi/float(scale);
}
return a;
}
答案 0 :(得分:0)
您需要将a
作为参数传递给wave
函数,因此每次传递循环(或每次调用未滚动的循环)都会保留先前的值。如果您发现保留a
而未明确传入的情况(例如您的for循环),这就是一个错误,那么您将返回a
&#39; s未初始化的值,假设未初始化的值将是前一次传递的答案。
以下是GLSL沙盒中的差异,我得到了这个功能。关键区别在于a
初始化为0.0
,然后在每次迭代时传递到wave
。