如何为 GLSL 中的不同结构成员定义不同的限定符?

How to define different qualifiers for the different struct members in GLSL?

我正在使用 WebGL,并且我想在我的片段和顶点着色器代码中使用结构化代码,而不仅仅是全局定义它们,因为在 OOP 方面进行了大量工作后眼睛变得锐利了。

我遇到了下一个问题,我无法为不同的 struct 成员定义不同的限定符。

例如:

struct Light
{
    vec3 normal;
    vec3 position;
    bool isDirectional;
    ...
};

我可以像这样创建这个结构的实例:

uniform Light lightInstance;

但是,如您所见,我只能定义一个限定符。

如果尝试使用类似的东西:

varying Light.normal normalValue;
uniform Light.position lightPosition;

然后,我也不能在使用 GLSL 的同时使用 typedefmemcpypointers。 我知道,我应该阅读更多关于 GLSL 的内容,我会这样做的。

但是要获得关于 WebGL 着色语言的准确文档是相当困难的。

所以,问题是:我想为单个结构的不同成员定义不同的限定符。在 GLSL(用于 WebGL)中甚至有可能吗?如果答案是,优雅的传递方式是什么?

参考 GLSL ES

通过着色语言对 GPU 进行编程与使用 C 对 CPU 进行编程不同,GPU 不是 CPU 并且 GLSL 不是 C:缺少一些关键字和结构。

您应该将顶点着色器视为函数,其中统一值是全局只读变量,而变化值是输出值。片段着色器类似,但变化值现在是输入值,统一仍然是全局只读变量。
所以全局变量不是它们在 CPU 应用程序中通常使用的变量,着色器很少变得复杂到足以从 OOP 中获益,过程方法仍然更优雅

为什么要让一个结构的成员与 uniform 一样,而另一个 结构的成员与varying 一样?
通常光线是均匀的,在什么值(即顶点属性)之间会插入光线的法线成员(方向?)?

这种使用限定符的尝试要么意味着您不完全理解统一变量和可变变量是什么,要么不完全理解 struct 在编程中的用途。