GLSL:编译器会使用常量参数来评估函数吗?

时间:2016-03-23 16:22:29

标签: opengl optimization compilation

如果我在GLSL片段着色器中有以下代码:

float r = 0.386;
float a = 26.6;
float xd = r*cos(0.0174532924*(a+0));
float yd = r*sin(0.0174532924*(a+0));
float xe = r*cos(0.0174532924*(a+90));
float ye = r*sin(0.0174532924*(a+90));

这是一个合理的假设,编译器将评估这些三角函数而不是在每个片段执行中评估它们吗?

2 个答案:

答案 0 :(得分:0)

在这种情况下,遗憾的是,你不能太了解,因为编译是由GPU完成的。我会说这是依赖于实现的,因为一些编译器可能会更好地优化。

然而,正如WearyWanderer所说,你可以硬编码值或通过制服/ UBO传递它们。

答案 1 :(得分:0)

正如您所提到的,您可以计算这些值并直接指定它们,但是为了文档目的,我想让它们在每次执行着色器代码时都是相同的。

统一变量是可以计算一次,发送到着色器的变量,并且对于每次执行都是相同的,除非您在某个时刻更改统一变量。例如:

    float r = 0.386;
    float a = 26.6;

    float xd_val = r*cos(0.0174532924*(a+0));
    GLuint xd_id = glGetUniformLocation(pShaderProgram, "xd");
    glUniform1f(xd_id, xd_val);

这只在CPU上计算一次值,将其作为统一变量传递给着色器程序,并且着色器可以在不重新执行的情况下访问每次执行的值,但仍然会在此处留下代码以供您的文档使用你想要的。

统一通常用于对象宽值,I.E是一个alpha值,传递用于phong着色器模型的场景灯等。