Glsl mod vs Hlsl fmod

时间:2011-09-30 12:51:34

标签: math opengl directx glsl hlsl

我在HLSL中实现了this question中描述的螺旋GLSL着色器,但结果并不相同。我认为这是因为GLSL中的mod函数我已在HLSL中转换为fmod。我怀疑只有在fmod函数的输入中有负数时才会出现此问题。

我已经尝试通过调用我已经创建的函数替换mod的调用来执行GLSL documentation中描述的函数并且它有效:

  

mod返回x modulo y的值。这计算为x - y * floor(x/y)

我使用的工作代码代替fmod

float mod(float x, float y)
{
  return x - y * floor(x/y)
}

与GLSL mod相比,MSDN says HLSL fmod函数执行此操作:

  

浮点余数的计算方式为x = i * y + f,其中i为整数,fx的符号相同,且绝对值为{ {1}}小于f的绝对值。

我使用了an HLSL to GLSL convertery函数被翻译为fmod。但是,我不知道我是否可以认为mod转换为mod

问题

  1. GLSL fmod和HLSL mod之间有什么区别?
  2. 如何将MSDN对fmod的神秘描述翻译成伪代码实现?
  3. GLSL Shader

    fmod

    HLSL Shader

    uniform float time;
    uniform vec2 resolution;
    uniform vec2 aspect;
    
    void main( void ) {
      vec2 position = -aspect.xy + 2.0 * gl_FragCoord.xy / resolution.xy * aspect.xy;
      float angle = 0.0 ;
      float radius = length(position) ;
      if (position.x != 0.0 && position.y != 0.0){
        angle = degrees(atan(position.y,position.x)) ;
      }
      float amod = mod(angle+30.0*time-120.0*log(radius), 30.0) ;
      if (amod<15.0){
        gl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );
      } else{
        gl_FragColor = vec4( 1.0, 1.0, 1.0, 1.0 );                    
      }
    }
    

1 个答案:

答案 0 :(得分:16)

正如你所说,他们是不同的。 GLSL mod将始终与y相同,而不是x。否则它是相同的 - 值f使得x = i*y + f i是整数和|f| < |y|。如果你试图制作某种重复模式,GLSL mod通常就是你想要的。

为了进行比较,HLSL fmod相当于x - y * trunc(x/y)。当x/y为正时,它们是相同的,当x/y为负时,它们是不同的。