Constant float values in GLSL shaders - any reason to use uniforms?

只谈情不闲聊 提交于 2019-12-04 17:02:18

问题


I'm looking at the source of an OpenGL application that uses shaders. One particular shader looks like this:

uniform float someConstantValue;
void main()
{
    // Use someConstantValue
}

The uniform is set once from code and never changes throughout the application run-time.

In what cases would I want to declare someConstantValue as a uniform and not as const float?

Edit: Just to clarify, the constant value is a physical constant.


回答1:


First off, the performance difference between using a uniform or a constant is probably negligible. Secondly, just because a value is always constant in nature doesn't mean that you will always want it be constant in your program. Programmers will often tweak physical values to produce the best looking result, even when that doesn't match reality. For instance, the acceleration due to gravity is often increased in certain types of games to make them more fast paced.

If you don't want to have to set the uniform in your code you could provide a default value in GLSL:

uniform float someConstantValue = 12.5;

That said, there is no reason not to use const for something like pi where there would be little value in modifying it....




回答2:


Huge reason:

Error: Loop index cannot be compared with non-constant expression.

If I use:

uniform float myfloat;
...
for (float i = 0.0; i < myfloat; i++)

I get an error because myfloat isn't a constant expression.


However this is perfectly valid:

const float myfloat = 10.0;
...
for (float i = 0.0; i < myfloat; i++)

Why?

When GLSL (and HLSL for that matter) are compiled to GPU assembly instructions, loops are unrolled in a very verbose (yet optimized using jumps, etc) way. Meaning the myfloat value is used during compile time to unroll the loop; if that value is a uniform (ie. can change each render call) then that loop cannot be unrolled until run time (and GPUs don't do that kind of JustInTime compilation, at least not in WebGL).




回答3:


I can think of two reasons:

  1. The developer reuses a library of shaders in several applications. So instead of customizing each shader for every app, the developer tries to keep them general.

  2. The developer anticipates this variable will later be a user-controlled setting. So declaring it as uniform is preparation for that upcoming feature.

If I was the developer and none of the above applies then I would declare it as "const" instead because it can give a performance benefit and I wouldn't have to set the uniform from my code.



来源:https://stackoverflow.com/questions/17400930/constant-float-values-in-glsl-shaders-any-reason-to-use-uniforms

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!