我感兴趣的是关于速度的信息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 );
}
或将GLSL
编译器或sin()
和cos()
实现照顾优化像我吗?
例如,在我的应用程序,它会是很常见的说法是0,所以做这样的事情是有意义的:
没有。
你的编译器会做两件事情之一。
- 它会发出一个实际的条件分支。 在最好的情况下,如果0的值是一致的本地(以使着色器的团体将经常打0或非零在一起),那么你可能会提高性能。
- 它会评估条件的两侧 ,只把结果保存为他们的正确的。 在这种情况下,你一无所获。
在一般情况下,它不是使用条件逻辑跳舞像这样围绕小的性能是个好主意。 它需要真正的大是值得的,像discard
或东西。
另外,请注意,浮点等值是不可能奏效。 除非你真正准确地传递含0.0着色器的统一或顶点属性。 即使是0和非零之间的插值可能永远都不会产生任何片段恰好为0。
这是一个很好的问题。 我也知道这一点。
Google'd链接说cos
和sin
自2005年左右是主流卡单周期。
你必须测试此自己,但我敢肯定,在着色器的分支比昂贵得多sin
或cos
计算。 GLSL的编译器是如何优化着色不错,担心这是过早的优化。 如果以后发现,通过你的整个程序,你的着色器的瓶颈,那么你可以不用担心这个优化。
如果你想看看你的着色器针对特定平台的汇编代码,我会推荐AMD GPU ShaderAnalyzer 。
不知道这是否回答你的问题,但它是很难告诉你有多少时钟/插槽的指令需要,因为它依赖于GPU非常多。 通常这是一个循环。 但即使没有,编译器可能会重新安排指令执行顺序来隐藏真实成本。 这当然慢用纹理查找的正弦/余弦,因为它是执行指令。
看你能有多少罪在一个着色器让一排,相比math.abs,压裂,等...我认为GTX 470每秒可以处理200层片段罪的功能没有probs,框架会比一个慢10%空着色器。 它的farly快,您可以发送结果。这将是计算效率的良好指标。
编译器评估两个分支,这使得条件相当昂贵。 如果您在着色器同时使用正弦和余弦,你可以只计算罪(一)和cos(A)=开方(1.0 - 罪(一)),因为的sin(x)*的sin(x)+ cos(x)的* COS(x)是始终1.0