英特尔nvidia OpenGL驱动程序差模函数 我的问题是,我的片段着色器在我的英特尔图形芯片上执行的非常不同,然后在英伟达芯片上执行。(两个驱动程序都是最新的)

英特尔nvidia OpenGL驱动程序差模函数 我的问题是,我的片段着色器在我的英特尔图形芯片上执行的非常不同,然后在英伟达芯片上执行。(两个驱动程序都是最新的),opengl,glsl,Opengl,Glsl,问题似乎是以下代码中的mod调用: float opRep( vec3 p, vec3 c ){ // gl_FragColor = vec4(max(0.0, sign(p.x)), max(sign(p.y), 0.0), max(sign(p.z), 0.0), 1); vec3 q = mod(p,c)-0.5*c; gl_FragColor = vec4(max(0.0, sign(q.x)), max(sign(q.y), 0.0), max(sign(q.z), 0.0

问题似乎是以下代码中的mod调用:

float opRep( vec3 p, vec3 c ){
  // gl_FragColor = vec4(max(0.0, sign(p.x)), max(sign(p.y), 0.0), max(sign(p.z), 0.0), 1);
  vec3 q = mod(p,c)-0.5*c;
  gl_FragColor = vec4(max(0.0, sign(q.x)), max(sign(q.y), 0.0), max(sign(q.z), 0.0), 1);
  return twistedColumn( q );
}

float distanceFromPoint(vec3 point) {
  return opRep(point, vec3(90.5, 0, 98));
}
gl_FragColor是我的“调试”语句。debug语句打印点的符号,因为我认为mod函数在diffrenet驱动程序上返回不同的符号

如果取消对第一个调试输出的注释,则会得到相同的视觉结果。但是在MOD之后,英特尔图形驱动程序和英伟达版本之间的视觉效果会发生变化,这是非常混乱的。p>
有人能给我一个提示,为什么我会得到不同的结果

mod
是一个不连续的阶跃函数--
p
中的一个很小的变化会导致
mod
0
c
之间切换。因此,
mod
的任何使用都会对舍入细节非常敏感,而舍入细节可能因GL实施而异。OpenGL没有规定插值的任何特定舍入方法或任何其他可能产生无法在实现的内部数字表示中精确表示的结果的操作。它只规定了计算的最低精度要求——任何实现如果愿意,都可以自由使用更高的精度

因此,可能发生的情况是,在某些计算中,其中一个芯片比另一个芯片使用更高的精度,或者一个芯片在向下舍入,而另一个芯片在向最近的方向舍入,或者其他一些变化或效果组合

vec4(max(0.0, sign(q.x)), max(sign(q.y), 0.0), max(sign(q.z), 0.0), 1);
...
vec3(90.5, 0, 98)
注意那些整数常量。GLSL不执行自动类型升级。试试这个:

vec4(max(0.0, sign(q.x)), max(sign(q.y), 0.0), max(sign(q.z), 0.0), 1.0);
...
vec3(90.5, 0.0, 98.0)
我很惊讶英特尔GLSL编译器让像幻灯片那样的类型错误没有警告


另外,确保所有着色器都以适当的
#version
指令开始。

使用0参数调用mod函数。如果我更改调用者返回opRep(point,vec3(90.5,0,98))中的0,intel驱动程序和nvidia将产生不同的结果

;返回opRep(点,vec3(90.5,0.0001,98));我在两个芯片上都得到了正确的结果。如果我通过0,则y分量的符号在intel上的处理方式不同。您可以使用:vec3 modResult=mod(p,c);gl_FragColor=vec4(最大值(0.0,符号(modResult.x)),最大值(符号(modResult.y),0.0),最大值(符号(modResult.z),0.0),1);图像的上半部分在英特尔芯片白色上,这意味着Y的符号是正的,但不是英伟达芯片上的,它是所有的品红???在GLSL编译中的任何东西和英特尔的链接日志?没有任何与英特尔有关的,遵循Nvidia:顶点信息-------- 0(2):警告C75 55:“属性”被禁止,使用“in /Out-'”而不是0(3)。:警告C7555:“variable”已弃用,请使用“in/out”代替片段信息------------------0(267):警告C7533:在版本120之后,全局变量gl_FragColor已弃用,因此没有。。。