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

时间:2015-07-13 16:27:08

标签: c opengl-es glsl webgl

我正在使用WebGL,我希望在我的片段和顶点着色器代码中使用结构化代码,而不仅仅是全局定义它们,因为眼睛锐利,需要大量的OOP工作。

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

例如:

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

我可以创建这个结构的实例,如:

uniform Light lightInstance;

但是,正如您能够看到的那样,我只能定义一个限定符。

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

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

然后,我也无法使用typedefmemcpypointers来使用GLSL。 我知道,我应该阅读更多关于GLSL的内容,我会这样做。

但是很难准确地掌握有关WebGL着色语言的文档。

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

1 个答案:

答案 0 :(得分:2)

GLSL ES的参考。

通过着色语言编程GPU与使用C编程CPU, GPU不是CPU GLSL不是C :一些关键字和构造缺失。

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

为什么您希望将结构的成员限定为uniform,将相同结构的另一成员设为varying? 通常光是均匀的,在光的正常成员(方向?)被插值的值(即顶点属性)之间是什么?

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