关于glsl for循环

时间:2015-02-27 17:28:14

标签: glsl pixel-shader

我刚遇到这个问题而且我不知道如何看待它。 我想我对它的工作方式有直觉,但我想知道你们中有些人是否可以给我一个答案。

所以,我有一个返回浮点数的函数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. );

渲染得很好,在另一个之后画一个波浪,从最远和最亮的correct开始。

但是,如果我这样做:

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. );

它将仅绘制最近的波也是最后一波this one,忽略其他波。 我的经验告诉我,在大多数情况下和编程语言中,上面两个都有些相同。你能告诉我这里有什么区别吗?

波函数:

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;
}

1 个答案:

答案 0 :(得分:0)

您需要将a作为参数传递给wave函数,因此每次传递循环(或每次调用未滚动的循环)都会保留先前的值。如果您发现保留a而未明确传入的情况(例如您的for循环),这就是一个错误,那么您将返回a&#39; s未初始化的值,假设未初始化的值将是前一次传递的答案。

以下是GLSL沙盒中的差异,我得到了这个功能。关键区别在于a初始化为0.0,然后在每次迭代时传递到wave

http://glslsandbox.com/diff#23978.0-vs-24192.0