在我的设置中可以正常工作,但要确定。
使用glsl 430,我在我的几何着色器中有这个

#version 430
layout (points) in;
layout (triangle_strip) out;
layout (max_vertices = 24) out;

uniform mat4 u_projMatrix;
uniform mat4 u_viewMatrix;

mat4 viewProjection = u_projMatrix * u_viewMatrix;

void someFunction1(){
 // uses viewProjection
}

void someFunction2(){
 // uses viewProjection
}

void main()
{
  // uses viewProjection
}

我关心的是viewProjection,我希望viewProjectionmain()之前初始化。我仔细阅读了glsl手册,看起来它可以做到这一点,并且应该可以正常编译。如果代码无效,有人可以向我介绍规范中的内容,谢谢

最佳答案

是的,此代码在技术上没问题。该规范允许您使用任意表达式来初始化全局变量,即使是使用uniform的表达式等。本质上,它们将在main开始之前执行。

但您实际上不应使用此功能。

首先,这种事情在着色器代码中很少见。因此,不太可能针对OpenGL实现正确的测试。这意味着实现更有可能以某种方式使此代码出错。只用main编写代码更加安全。

其次,您隐藏了着色器的成本。如果您的初始化不是常量表达式,那么它们实际上将花费执行时间。但是您不会在main或任何函数main调用中看到它。它会以您通常认为的“代码”之外的形式存在。但是它仍然会降低性能。

07-28 00:35