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

Opengl glsl性能:tan(acos(x))与sqrt(1-x*x)/x,opengl,glsl,shadow-mapping,Opengl,Glsl,Shadow Mapping,我正在编写一个glsl片段着色器,其中使用了阴影映射。在本教程之后,我写了这行代码来评估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 ) /

我正在编写一个glsl片段着色器,其中使用了阴影映射。在本教程之后,我写了这行代码来评估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和ACO方面更快吗?”
…还是我遗漏了什么

使用AMD GPU着色器分析器显示
浮点偏差=0.005*sqrt(1.f-N_L_点*N_L_点)/N_L_点
将在着色器程序集中生成较少的时钟周期指令(4条指令估计4个时钟周期)

其中
浮动偏差=0.005*tan(acos(N_L_点))生成了15条指令,估计要完成8个时钟周期

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


看起来sqrt方法通常会表现得更好

那么,您是否尝试过在您关心的硬件上对其进行基准测试?答案可能会有很大差异(从“#1快”超过“大约同样快”到“#2快”),这取决于硬件、代码的其余部分(现代GPU显然很擅长在等待内存时保持忙碌),等等@delnan嗯,不,我想知道是否有一个独立于硬件的答案,因为我不能在很多不同的gpu上测试,我希望我的软件能在任何现代的高端gpu上快速运行。我想你可能真的可以删除sqrt(我的数学有点生疏)。通过对偏置函数进行平方运算,并将其与之进行比较。如果您能够做到这一点,新功能将更快。(不确定对浮动精度等有什么影响)@FULLFRONTALDULUNDUTY哈!谢谢你!我认为这是个好建议!如果我在比较之前把所有的东西都平方,它不会影响浮点精度。那么你能报告你的发现吗?