【问题标题】:Intel nvidia OpenGL driver difference mod-functionIntel nvidia OpenGL 驱动差异 mod-function
【发布时间】:2013-02-24 17:05:06
【问题描述】:

我的问题是片段着色器在英特尔图形芯片上的执行与在英伟达芯片上的执行方式截然不同。 (两个驱动程序都是最新的)

问题似乎是以下代码中的 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 是我的“调试”语句。调试语句打印点的符号,因为我认为 mod 函数在不同的驱动程序上返回不同的符号。

如果我取消注释第一个调试输出,我会得到相同的视觉结果。但是在mod之后,intel图形驱动程序和nvidia版本之间的视觉效果不同,这非常令人困惑。

谁能给我一个提示,为什么我会得到不同的结果...?

【问题讨论】:

  • GLSL 编译中的任何内容以及与英特尔的链接日志?
  • None with intel, next by nvidia: Vertex info ----------- 0(2) : warning C7555: 'attribute' is deprecated, use 'in/out' instead 0(3) : 警告 C7555: 'variing' 已被弃用,使用 'in/out' 代替 Fragment info ------------- 0(267) : 警告 C7533: 全局变量 gl_FragColor 被弃用版本 120 所以没有...

标签: opengl glsl


【解决方案1】:

mod 是一个不连续的阶跃函数——p 的一个非常小的变化可能导致mod0c 之间翻转。因此,mod 的任何使用都对舍入细节非常敏感,这可能因 GL 实现而异。 OpenGL 没有为插值或任何其他可能给出无法在实现的内部数字表示中精确表示的结果的操作规定任何特定的舍入方法。它只规定了计算的最低精度要求——任何实现都可以随意使用更高的精度。

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

【讨论】:

  • 如果我改变调用者中的 0 返回 opRep(point, vec3(90.5, 0, 98));返回 opRep(point, vec3(90.5, 0.0001, 98));我在两个芯片上都得到了正确的结果。如果我传递一个 0,则 y 分量的符号在英特尔上的处理方式不同。您可以使用: vec3 modResult = mod(p, c); gl_FragColor = vec4(max(0.0, sign(modResult.x)), max(sign(modResult.y), 0.0), max(sign(modResult.z), 0.0), 1);图像的上半部分在intel芯片上是白色的,表示y的符号是正的,但在nvidia芯片上没有,都是洋红色???
【解决方案2】:
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 指令开头。

【讨论】:

    【解决方案3】:

    您使用 0 参数调用您的 mod 函数。 intel驱动和nvidia会产生不同的结果

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-10
      • 2013-01-06
      • 2012-10-13
      • 1970-01-01
      • 2019-08-30
      • 1970-01-01
      • 2018-11-05
      • 1970-01-01
      相关资源
      最近更新 更多