Math Glsl模块与Hlsl fmod

Math Glsl模块与Hlsl fmod,math,opengl,directx,glsl,hlsl,Math,Opengl,Directx,Glsl,Hlsl,我已经实现了HLSL中描述的螺旋GLSL着色器,但结果不一样。我想这是因为GLSL中的mod函数,我在HLSL中翻译成了fmod。我怀疑只有当fmod函数的输入中有负数时,才会出现此问题 我已尝试将对mod的调用替换为对我所做函数的调用,该函数执行中所述的操作,并且可以正常工作: mod返回x模y的值。这被计算为x-y*楼层(x/y) 我使用的工作代码而不是fmod是: float mod(float x, float y) { return x - y * floor(x/y) } 与G

我已经实现了HLSL中描述的螺旋GLSL着色器,但结果不一样。我想这是因为GLSL中的
mod
函数,我在HLSL中翻译成了
fmod
。我怀疑只有当
fmod
函数的输入中有负数时,才会出现此问题

我已尝试将对
mod
的调用替换为对我所做函数的调用,该函数执行中所述的操作,并且可以正常工作:

mod
返回
x
y
的值。这被计算为
x-y*楼层(x/y)

我使用的工作代码而不是
fmod
是:

float mod(float x, float y)
{
  return x - y * floor(x/y)
}
与GLSL
mod
相反,HLSL
fmod
功能实现以下功能:

浮点余数的计算使得
x=i*y+f
,其中
i
是整数,
f
具有与
x
相同的符号,
f
的绝对值小于
y
的绝对值

我已经使用了,
fmod
函数被翻译为
mod
。但是,我不知道是否可以假设
mod
转换为
fmod

问题
  • GLSL
    mod
    和HLSL
    fmod
    之间有什么区别
  • 如何将MSDN对
    fmod
    的神秘描述转换为伪代码实现
  • GLSL着色器
    统一浮动时间;
    均匀vec2分辨率;
    均匀vec2相位;
    真空总管(真空){
    vec2位置=-aspect.xy+2.0*gl_FragCoord.xy/resolution.xy*aspect.xy;
    浮动角度=0.0;
    浮动半径=长度(位置);
    if(position.x!=0.0&&position.y!=0.0){
    角度=度(atan(位置y,位置x));
    }
    浮动amod=mod(角度+30.0*时间-120.0*对数(半径),30.0);
    
    如果(amod正如您所注意到的,它们是不同的。GLSL
    mod
    将始终具有与
    y
    相同的符号,而不是
    x
    。否则它是相同的——一个值
    f
    ,使得
    x=i*y+f
    其中
    i
    是一个整数,如果您试图创建som的重复模式例如,GLSL
    mod
    通常是您想要的


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

    我想你可以在HLSL中使用%作为mod。是的,我尝试过,但%给出了完全相同的问题。螺旋线没有正确表示。1/4是可爱的。如果能看到两个着色器,以便我们可以比较它们,那会很有帮助。好的,你是对的。我走了我们正在努力提供它们
    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 );                    
      }
    }
    
    struct Psl_VertexShaderInput
    {
        float3 pos : POSITION;
    };
    
    struct Psl_VertexShaderOutput
    {
        float4 pos : POSITION;
    
    };
    
    struct Psl_PixelShaderOutput
    {
        float4 Output0 : COLOR0;
    };
    
    float3 psl_positionOffset;
    float2 psl_dimension;
    
    Psl_VertexShaderOutput Psl_VertexShaderFunction(Psl_VertexShaderInput psl_input)
    {
        Psl_VertexShaderOutput psl_output = (Psl_VertexShaderOutput)0;
    
        psl_output.pos = float4(psl_input.pos + psl_positionOffset, 1);
    
    
        return psl_output;
    }
    
    float time : TIME;
    float2 resolution : DIMENSION;
    
    
    Psl_PixelShaderOutput Psl_PixelShaderFunction(float2 pos : VPOS)
    {
        Psl_PixelShaderOutput psl_output = (Psl_PixelShaderOutput)0;
    
        float2 aspect = float2(resolution.x / resolution.y, 1.0);
        float2 position = -aspect.xy + 2.0 * pos.xy / resolution.xy * aspect.xy;
        float angle = 0.0;
        float radius = length(position);
        if (position.x != 0.0 && position.y != 0.0)
        {
            angle = degrees(atan2(position.y, position.x));
        }
        float amod = fmod((angle + 30.0 * time - 120.0 * log(radius)), 30.0);
        if (amod < 15.0)
        {
            psl_output.Output0 = float4(0.0, 0.0, 0.0, 1.0);
            return psl_output;
        }
    
        else
        {
            psl_output.Output0 = float4(1.0, 1.0, 1.0, 1.0);
            return psl_output;
        }
    
    }
    
    technique Default
    {
        pass P0
        {
            VertexShader = compile vs_3_0 Psl_VertexShaderFunction();
            PixelShader = compile ps_3_0 Psl_PixelShaderFunction();
        }
    }