GLSL“in”结构

时间:2012-02-14 02:36:11

标签: opengl glsl

我不允许使用带有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也可以在这里使用,但zw的含义与“width”和“height”的含义不同,只是一个例子)

我想你只能用glVertexAttribPointer为每个位置指定一个类型,所以我可以看到为什么不允许结构...我只是想办法保持我的代码清洁和在不影响性能的情况下实现可靠​​性。

1 个答案:

答案 0 :(得分:4)

您不能拥有struct s。

的顶点着色器输入

执行此操作的正确方法是将它们粘贴在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 s:

layout(location = 7, component = 0) in vec2 rectPos;
layout(location = 7, component = 2) in vec2 rectSize;

现在我们得到一些语义信息。 rectPos是矩形的位置,而rectSize是其大小。它仍然只占一个位置。

增强的布局功能允许它适用于任何输入和输出,而不仅仅是顶点着色器。