在我的设置中工作正常,但请确保。使用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
,我希望viewProjection
在main()
之前被初始化。我仔细阅读了glsl手册,看起来它可以完全做到这一点,并且应该可以正常编译。如果代码无效,有人可以向我介绍一下规范,谢谢
是的,此代码在技术上很好。该规范允许您使用任意表达式来初始化全局变量,甚至是使用uniform
等的变量。本质上,它们将在main
开始之前执行。
但是您实际上不应使用此。
首先,这种事情在着色器代码中很少见。因此,不太可能针对OpenGL实施正确的测试。这意味着实现以某种方式获得此代码错误的可能性更大。仅在main
中编写代码更加安全。
第二,您隐藏了着色器的成本。如果您的初始化不是常量表达式,那么它们实际上将花费执行时间。但是您不会在main
或任何函数main
调用中看到它。它会以您通常认为的“代码”之外的形式存在。但是它仍然会降低性能。