Opengl GLSL";在;结构

Opengl GLSL";在;结构,opengl,glsl,Opengl,Glsl,我不允许在关键字中使用带有的结构,是吗?例如: struct Rect { float x,y,width,height; }; layout(location = 7) in Rect TexSrc; 谷歌搜索很困难,但当我尝试使用我的GLSL着色器时,出现了一个错误(INVALID_OPERATION)。不过,我似乎可以使用float[4] 如果不允许我使用结构,你建议我怎么做?用一个浮点[4]构造结构,或者把它吸收起来,放弃漂亮的API,到处使用索引0-3 (Avec4在这里也

我不允许在关键字中使用带有
的结构,是吗?例如:

struct Rect {
    float x,y,width,height;
};

layout(location = 7) in Rect TexSrc;
谷歌搜索很困难,但当我尝试使用我的GLSL着色器时,出现了一个错误(
INVALID_OPERATION
)。不过,我似乎可以使用
float[4]

如果不允许我使用结构,你建议我怎么做?用一个
浮点[4]
构造结构,或者把它吸收起来,放弃漂亮的API,到处使用索引0-3

(A
vec4
在这里也可以,我知道,但是
z
w
与“宽度”和“高度”的含义并不完全相同,这只是一个例子)


我想您只能使用
glvertexattributepointer
为每个位置指定一个类型,这样我就可以了解为什么不允许使用结构。。。我只是想找到一种方法,在不影响性能的情况下保持代码干净易懂。

不能使用
struct
s的顶点着色器输入

正确的方法是将它们粘贴在
vec4
中。如果使用
浮点[4]
,则需要四个属性,而不仅仅是一个属性。数组总是对每个元素使用一个属性。因此,如果您在float[4]TexSrc中进行
布局(位置=7),这将占用属性索引7、8、9和10。这是对属性的严重浪费,而且可能会降低性能

只需像其他人一样使用
vec4
。人们总是在
vec4
s中打包输入;他们用注释来解释任何语义上的奇怪之处

顺便说一句,如果您得到一个无效的操作,这可能意味着您实际上没有检查着色器是否正确编译和链接。你应该

新东西 OpenGL 4.4或ARB_增强的_布局扩展,允许您执行类似的操作

如前所述,float[4]TexSrc中
布局(位置=7)的主要问题是指它占用4个输入位置。因此,如果您有4个不是真正的4D向量的浮动,您仍然必须将它们打包到
vec4
中,以便运送到着色器中:

layout(location = 7) in vec4 rect;
这使得了解
rect.z
在着色器中的含义变得更加困难,因为它没有任何明确的含义

4.4/增强的_布局允许您。因此,如果每个位置在概念上是一个
vec4
,我们可以将其分为2个
vec2
s:

layout(location = 7, component = 0) in vec2 rectPos;
layout(location = 7, component = 2) in vec2 rectSize;
现在我们得到一些语义信息
rectPos
是矩形的位置,
rectSize
是矩形的大小。它仍然只占据一个位置


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

OpenTK应该在出现GL错误时自动抛出异常。似乎从未在
glLinkProgram
上发生过,但它确实发生在其他地方(例如
glUseProgram
)。然后我将使用
vec4
。我只是想确认一下我的想法是对的,谢谢!对任何GL错误抛出异常?你知道在每次命令后刷新管道并检查错误的效率有多低吗?@Mark:链接失败与GL错误不同。您需要实际检查失败的编译/链接。@BenVoigt:如果调试
块,它们在
#内;它们甚至不会被编译成发行版。@bofjas:你可以看看GLSL规范。毫不奇怪,它出现在标题为