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;
}
着色器硬件没有调用堆栈,因此像内联和变量范围这样的概念是完全不同的;但是,如何在函数声明中设置变量***非常重要。在GLSL中,可以在函数声明中使用存储限定符(例如'alphaForPos(在vec4 pos,在vec4 nearVertex中)')告诉编译器在变量函数体内的值发生变化时创建变量的本地副本。另一方面,'inout'意味着在函数内进行的任何更改都可以在其外部传播,并且不需要复制。 –
所以有点像在C#中作为参考传递,它不会像在C++中使用const Object&var那样创建副本,对吧? – Hodor
是的,你可以这样想。复制变量并不像C++这样的语言那样难以预测,它可能会调用一个不平凡的拷贝构造函数,但是您仍然必须处理有限的寄存器空间,浪费的时钟周期等。 –