glsl性能:tan(acos(x))vs sqrt(1-x*x)/ x

dar*_*ius 3 opengl glsl shadow-mapping

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

float bias = 0.005 * tan( acos ( N_L_dot ) );
Run Code Online (Sandbox Code Playgroud)

但我从数学上知道

tan ( acos ( x ) = sqrt ( 1 - x^2 ) / x
Run Code Online (Sandbox Code Playgroud)

使用这种身份而不是棕褐色和acos会更快吗?在实践中,要使用这行代码

float bias = 0.005 * sqrt ( 1.f - N_L_dot * N_L_dot   ) / N_L_dot ;
Run Code Online (Sandbox Code Playgroud)

我认为我的问题类似于"在执行sqrt和划分或tan和acos时,gpu更快吗?" ......或者我错过了什么?

Aar*_*gan 8

使用AMD GPU Shader Analyzer,它表明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方法通常会表现得更好.