我正在使用WebGL,我希望在我的片段和顶点着色器代码中使用结构化代码,而不仅仅是全局定义它们,因为眼睛锐利,需要大量的OOP工作。
我已经遇到了下一个问题,我无法为不同的struct
成员定义不同的限定符。
例如:
struct Light
{
vec3 normal;
vec3 position;
bool isDirectional;
...
};
我可以创建这个结构的实例,如:
uniform Light lightInstance;
但是,正如您能够看到的那样,我只能定义一个限定符。
如果尝试使用类似的东西:
varying Light.normal normalValue;
uniform Light.position lightPosition;
然后,我也无法使用typedef
,memcpy
,pointers
来使用GLSL。
我知道,我应该阅读更多关于GLSL的内容,我会这样做。
但是很难准确地掌握有关WebGL着色语言的文档。
所以,问题是:我想为单个结构的不同成员定义不同的限定符。它甚至可以用于GLSL(用于WebGL)吗?如果答案是否,那么传递它的优雅方式是什么?
答案 0 :(得分:2)
GLSL ES的参考。
通过着色语言编程GPU与使用C编程CPU, GPU不是CPU 和 GLSL不是C :一些关键字和构造缺失。
您应该将顶点着色器视为函数,其中统一值是全局只读变量,而变化值是输出值。片段着色器类似,但是变化的值现在是输入值,而uniform仍然是全局只读变量 因此,全局变量并不是它们在CPU应用程序中通常的变化,并且着色器很少变得足够复杂以从OOP中受益,程序方法仍然更加优雅。
为什么您希望将结构的成员限定为uniform
,将相同结构的另一成员设为varying
?
通常光是均匀的,在光的正常成员(方向?)被插值的值(即顶点属性)之间是什么?
这种限定符的使用要么意味着你不完全理解什么是统一变量变量,要么你不完全理解编程中struct
的用途。