GLSL定义计算还是替换文本?

GLSL定义计算还是替换文本?,glsl,webgl,c-preprocessor,Glsl,Webgl,C Preprocessor,对于一些相对昂贵但具有运行前用户指定常量的常量,例如pow(),是否可以使用定义来减少运行时计算?或者,define的每个外观都会被它所定义的内容所取代 例如,这有什么好处: #define MENGER_ITER 3 #define MENGER_ITER_POW pow(3.0, -float(MENGER_ITER)) // ...other code return (length(max(abs(vec3(x, y, z))-1.0, 0.0))-0.25)*MENGER_ITER_P

对于一些相对昂贵但具有运行前用户指定常量的常量,例如
pow()
,是否可以使用
定义
来减少运行时计算?或者,
define
的每个外观都会被它所定义的内容所取代

例如,这有什么好处:

#define MENGER_ITER 3
#define MENGER_ITER_POW pow(3.0, -float(MENGER_ITER))

// ...other code
return (length(max(abs(vec3(x, y, z))-1.0, 0.0))-0.25)*MENGER_ITER_POW;
// ...other code
与此相反:

// ...other code
return (length(max(abs(vec3(x, y, z))-1.0, 0.0))-0.25)*pow(3.0, -float(MENGER_ITER));
// ...other code
#define
只执行文本替换

就你的情况而言,这和

shaderSource = shaderSource.replace(/MENGER_ITER_POW/g, "pow(3.0, -float(MENGER_ITER))");
shaderSource = shaderSource.replace(/MENGER_ITER/g, "3");
gl.shaderSource(someShader, shaderSource);
很像


好处是它使您的代码更具可读性?

谢谢,该值经常在我的一个分形着色器中计算。确切的次数未知(取决于场景和相机角度),但可能超过50000次(每像素)。那么我应该把它存到一个全局浮动中吗?我不知道。理论上,GLSL编译器应该看到它的所有常量,并在编译时将其优化为单个值,但我可以想象一些驱动程序不会这样做。您可以测试两种方法,一种是使用预先计算的值,另一种是按原样使用宏,看看是否注意到性能上的差异。不幸的是,它在每个GPU/驱动程序上都可能不同:(要清楚,您可以在JS中执行此操作。
var MENGER_ITER=3;src=src.replace(/MENGER_ITER_POW/g,Math.POW(3.0,-MENGER_ITER));