Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl GLSL:编译器会用常量参数计算函数吗?_Opengl_Optimization_Compilation - Fatal编程技术网

Opengl GLSL:编译器会用常量参数计算函数吗?

Opengl GLSL:编译器会用常量参数计算函数吗?,opengl,optimization,compilation,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)); 编译器将对这些三角函数求值,而不是在每次执行片段时对它们求值,这是一个合理的假设吗?

如果在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));

编译器将对这些三角函数求值,而不是在每次执行片段时对它们求值,这是一个合理的假设吗?

在这种情况下,很遗憾,您知道的不多,因为编译是由GPU完成的。我认为这取决于实现,因为某些编译器可能会得到更好的优化


但是,正如WearyWander所说,您可以对值进行硬编码或通过uniforms/UBO进行传递。

正如您所提到的,您可以计算值并直接分配它们,但出于文档目的,我认为在每次执行着色器代码时,值都是相同的

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

    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上计算一次值,将其作为统一变量传递给着色器程序,着色器可以在每次执行时访问该值,而无需对其重新校准,但仍将代码保留在此处以供您编写所需的文档


Uniform通常用于对象范围的值,即alpha值,为phong着色器模型传入场景灯光等。

取决于优化级别和编译器,但您是否尝试查看程序集?如果您只需要计算一次,为什么不计算它们并发送到统一变量或UBO?实际上我可以用计算器直接计算xd,yd,xe,你可以使用这些值,但是如果我可以依赖编译器,我希望代码保持这种状态,以便进行自我文档编制。如果你可以计算它并直接赋值,那么你肯定希望通过一个统一的变量来实现这一点。我会发布一个解释的答案