我不允许使用带有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
的含义与“width”和“height”的含义不同,只是一个例子)
我想你只能用glVertexAttribPointer
为每个位置指定一个类型,所以我可以看到为什么不允许结构...我只是想办法保持我的代码清洁和在不影响性能的情况下实现可靠性。
答案 0 :(得分:4)
您不能拥有struct
s。
执行此操作的正确方法是将它们粘贴在vec4
中。如果您使用float[4]
,则需要四个属性而不是一个。数组总是占用每个元素一个属性。因此,如果你执行layout(location = 7) in float[4] TexSrc;
,这将占用属性索引7,8,9和10.这是对属性的极大浪费,并且可能会降低性能。
像其他人一样使用vec4
。人们一直在vec4
打包输入;他们用评论来解释任何语义怪异。
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
s:
layout(location = 7, component = 0) in vec2 rectPos;
layout(location = 7, component = 2) in vec2 rectSize;
现在我们得到一些语义信息。 rectPos
是矩形的位置,而rectSize
是其大小。它仍然只占一个位置。
增强的布局功能允许它适用于任何输入和输出,而不仅仅是顶点着色器。