不允许将结构与in关键字一起使用,对吗?例如:
struct Rect {
float x,y,width,height;
};
layout(location = 7) in Rect TexSrc;这很难谷歌,但我得到一个错误,当我尝试使用我的GLSL着色器(INVALID_OPERATION)。但是,我似乎被允许使用float[4]。
如果不允许我使用结构,你建议我怎么做?在float[4]中构造结构,或者接受它,放弃漂亮的API,到处使用索引0-3?
(我知道vec4在这里也可以用,但是z和w与“宽度”和“高度”的含义不太一样,这只是一个例子)
我认为您只能使用glVertexAttribPointer为每个位置指定一个类型,所以我可以理解为什么不允许使用结构……我只是在尝试想一种方法来保持代码的整洁和易懂,同时又不会影响性能。
发布于 2012-02-14 10:58:46
不能有struct的顶点着色器输入。
正确的方法是将它们放在vec4中。如果使用float[4],则需要四个属性,而不是一个属性。数组总是占用每个元素的一个属性。因此,如果使用layout(location = 7) in float[4] TexSrc;,将占用属性索引7、8、9和10,这是对属性的极大浪费,而且可能会降低性能。
只要像其他人一样使用vec4即可。人们总是将输入打包在vec4中;他们使用注释来解释任何语义上的奇怪之处。
顺便说一句,如果你得到一个无效的操作,这可能意味着你实际上没有检查你的着色器是否正确编译和链接。你应该使用always do that。
新东西
OpenGL 4.4或ARB_enhanced_layouts扩展允许您这样做。
如前所述,layout(location = 7) in float[4] TexSrc;的主要问题是它占用了4个输入位置。因此,如果你有4个不是真正的4D向量的浮点数,你仍然需要将它们打包到vec4中,以便装运到着色器中:
layout(location = 7) in vec4 rect;这使得了解rect.z在着色器中的含义变得更加困难,因为它没有任何明确的含义。
4.4/enhanced_layouts允许您使用pack multiple variables in a single location, so long as their components don't overlap。因此,如果每个位置在概念上都是一个vec4,我们可以将其拆分为2个vec2:
layout(location = 7, component = 0) in vec2 rectPos;
layout(location = 7, component = 2) in vec2 rectSize;现在我们得到了一些语义信息。rectPos是矩形的位置,而rectSize是矩形的大小。它仍然只占据一个位置。
增强的布局功能允许此功能适用于任何输入和输出,而不仅仅是顶点着色器。
https://stackoverflow.com/questions/9270954
复制相似问题