2013-12-22 28 views
4

我现在开始学习着色器(HLSL,GLSL),我看到很多教程,其中没有创建多个变量,这使得阅读变得更加困难。我想知道是否创建新变量会影响着色器的性能。在编写着色器时,我应该避免创建多个变量吗?

因此,例如(在CG):

比这更快的这个

inline float alphaForPos(float4 pos, float4 nearVertex){ 
      return (1.0/_FogMaxRadius)*clamp(_FogRadius - max(length(pos.z - nearVertex.z),length(pos.x - nearVertex.x)), 0.0, _FogRadius)/_FogRadius; 
    } 

inline float alphaForPos(float4 pos, float4 nearVertex){ 
     float distX = length(pos.x - nearVertex.x); 
     float distZ = length(pos.z - nearVertex.z); 
     float alpha = 0.0; 
     alpha = _FogRadius - max(distZ,distX); 
     alpha = clamp(alpha, 0.0, _FogRadius); 
      return (1.0/_FogMaxRadius)*alpha/_FogRadius; 
    } 
+1

着色器硬件没有调用堆栈,因此像内联和变量范围这样的概念是完全不同的;但是,如何在函数声明中设置变量***非常重要。在GLSL中,可以在函数声明中使用存储限定符(例如'alphaForPos(在vec4 pos,在vec4 nearVertex中)')告诉编译器在变量函数体内的值发生变化时创建变量的本地副本。另一方面,'inout'意味着在函数内进行的任何更改都可以在其外部传播,并且不需要复制。 –

+0

所以有点像在C#中作为参考传递,它不会像在C++中使用const Object&var那样创建副本,对吧? – Hodor

+0

是的,你可以这样想。复制变量并不像C++这样的语言那样难以预测,它可能会调用一个不平凡的拷贝构造函数,但是您仍然必须处理有限的寄存器空间,浪费的时钟周期等。 –

回答

5

这不会影响性能。

在一天结束时,所有内容都被内联,编译器的优化部分在优化完成时并不关心单独的变量。

我编译了两个简单的像素着色器,它们调用这两个函数,并且都编译成HLSL中的9条指令。

为了可读性和信任,编译器会做正确的事情(至少在此:))。

+0

使得很多意义检查编译着色器中的指令数量。在我们相信的编译器中:) – Hodor

相关问题