我在HLSL中实现了this question中描述的螺旋GLSL着色器,但结果并不相同。我认为这是因为GLSL中的mod
函数我已在HLSL中转换为fmod
。我怀疑只有在fmod
函数的输入中有负数时才会出现此问题。
我已经尝试通过调用我已经创建的函数替换mod
的调用来执行GLSL documentation中描述的函数并且它有效:
mod
返回x
moduloy
的值。这计算为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
为整数,f
与x
的符号相同,且绝对值为{ {1}}小于f
的绝对值。
我使用了an HLSL to GLSL converter,y
函数被翻译为fmod
。但是,我不知道我是否可以认为mod
转换为mod
。
fmod
和HLSL mod
之间有什么区别? fmod
的神秘描述翻译成伪代码实现?fmod
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 );
}
}
答案 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
为负时,它们是不同的。