Glsl 编程着色器时是否应避免创建多个变量?

Glsl 编程着色器时是否应避免创建多个变量?,glsl,shader,hlsl,glsles,Glsl,Shader,Hlsl,Glsles,我现在开始学习着色器(HLSL、GLSL),我看到很多教程中没有创建太多变量,这使得阅读变得更加困难。我想知道创建新变量是否会影响着色器的性能 因此,例如(在CG中): 这是吗 inline float alphaForPos(float4 pos, float4 nearVertex){ return (1.0/_FogMaxRadius)*clamp(_FogRadius - max(length(pos.z - nearVertex.z),length(po

我现在开始学习着色器(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;
    }

这不会影响性能

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

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


追求可读性并相信编译器会做正确的事情(至少在这一点上:)。

着色器硬件没有调用堆栈,因此内联和变量范围等概念完全不同;但是,如何在函数声明中设置变量很重要。在GLSL中,您可以在函数声明中使用存储限定符(例如,
alphaForPos(在vec4 pos中,在vec4 nearVertex中)
),以告知编译器在更改函数体中的值时制作变量的本地副本<代码> InOut< <代码>,意味着函数内的任何更改都允许在其外部传播,并且不需要复制。所以,像C++中的引用一样,它不生成一个拷贝,例如C++中使用const对象和var,对吗?是的,你可以这样想。复制变量的成本并不像C++那样昂贵,它可以调用非平凡的复制构造函数,但是仍然需要处理有限的登记空间、浪费的时钟周期等等。检查编译着色器中的指令数量有很多意义。在我们信任的编译器中:)