在glsl中初始化全局变量?

问题描述 投票:0回答:1

在我的设置中工作正常,但请确保。使用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手册,看起来它可以完全做到这一点,并且应该可以正常编译。如果代码无效,有人可以向我介绍一下规范,谢谢

c++ opengl glsl
1个回答
0
投票

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

但是您实际上不应使用此。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.