在我的设置中可以正常工作,但要确定。
使用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
调用中看到它。它会以您通常认为的“代码”之外的形式存在。但是它仍然会降低性能。