GLSL着色器中cos()和sin()函数的速度?

ulm*_*ngt 17 opengl optimization shader glsl jogl

我感兴趣的是关于速度的信息sin(),并cos()Open GL的着色语言.

所述GLSL规范文献表明:

内置功能基本上分为三类:

  • ...
  • ...
  • 它们代表一种操作图形硬件可能在某些时候加速.三角函数属于这一类.

编辑:

正如已经指出的那样,像计算单个操作的时钟周期sin(),并cos()没有真正告诉整个故事的性能.

因此,为了澄清我的问题,我真正感兴趣的是,是否值得优化sin()cos()呼吁常见案例.

例如,在我的应用程序中,参数将是非常常见的0.这样的事情是否有意义:

float sina, cosa;

if ( rotation == 0 )
{
   sina = 0;
   cosa = 1;
}
else
{
   sina = sin( rotation );
   cosa = cos( rotation );
}
Run Code Online (Sandbox Code Playgroud)

或将GLSL编译器或sin()cos()实现照顾优化像我吗?

Nic*_*las 17

例如,在我的应用程序中,参数为0非常常见.所以这样的事情是有意义的:

没有.

您的编译器将执行以下两种操作之一.

  1. 它将发出一个实际的条件分支.在最好的情况下,如果0是一个局部相干的值(这样着色器组通常会一起命中0或非零),那么您可能会获得更好的性能.
  2. 它将评估条件的两侧,并仅将结果存储为正确的一个.在这种情况下,你什么都没得到.

一般来说,使用条件逻辑围绕这样的小性能跳舞并不是一个好主意.它需要非常大才有价值,比如某种discard东西.

另外,请注意浮点等效性不太可能.除非你实际上将一个包含0.0的统一或顶点属性传递给着色器.即使在0和非零之间插值,也可能永远不会为任何片段精确地产生0.


Wil*_*ill 7

这是一个很好的问题.我也想知道这件事.

自2005年左右以来,谷歌的链接cos并且sin在主流卡片上是单周期的.


Rob*_*ani 5

你必须自己测试一下,但我很确定着色器中的分支比计算sin或者cos计算要昂贵得多.GLSL编译器非常适合优化着色器,担心这是过早的优化.如果您后来发现,通过整个程序,着色器是瓶颈,那么您可以担心优化它.

如果您想查看特定平台的着色器的汇编代码,我建议使用AMD GPU ShaderAnalyzer.