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
(Avec4
在这里也可以,我知道,但是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规范。毫不奇怪,它出现在标题为