3

我正在编写一个使用阴影映射的 glsl 片段着色器。按照本教程http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-16-shadow-mapping/,我写了这一行来评估 shaodw 偏差以避免阴影痤疮

float bias = 0.005 * tan( acos ( N_L_dot ) );

但我从数学中知道

tan ( acos ( x ) = sqrt ( 1 - x^2 ) / x

使用这样的身份而不是 tan 和 acos 会更快吗?在实践中,要使用这行代码

float bias = 0.005 * sqrt ( 1.f - N_L_dot * N_L_dot   ) / N_L_dot ;

我认为我的问题类似于“gpu 在执行 sqrt 和除法或 tan 和 acos 方面是否更快?” ...还是我错过了什么?

4

1 回答 1

8

使用 AMD GPU 着色器分析器,它表明float bias = 0.005 * sqrt ( 1.f - N_L_dot * N_L_dot ) / N_L_dot ; 将在着色器程序集中生成更少的时钟周期指令(4 条指令估计 4 个时钟周期)。

其中float bias = 0.005 * tan( acos ( N_L_dot ) );生成的 15 条指令估计需要 8 个时钟周期才能完成。

我针对 Radeon HD 6450 汇编代码运行了两种不同的方法。但是对于不同的 Radeon HD 卡,结果似乎都很好。

看起来 sqrt 方法通常会执行得更好。

于 2013-07-22T18:33:12.627 回答