gpt4 book ai didi

opengl - GLSL "in"结构体

转载 作者:行者123 更新时间:2023-12-02 04:40:24 31 4
gpt4 key购买 nike

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

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

layout(location = 7) in Rect TexSrc;

Google 很难,但当我尝试使用 GLSL 着色器时遇到错误 (INVALID_OPERATION)。不过,看来我可以使用 float[4]

如果我不被允许使用结构,你建议我做什么?用 float[4] 构造结构体,还是放弃它,放弃漂亮的 API,并在各处使用索引 0-3?

(我知道,vec4 也可以在这里工作,但是 zw 与“的含义并不完全相同width”和“height”,这只是一个例子)

我想你只能使用glVertexAttribPointer为每个位置指定一个类型,所以我可以明白为什么不允许使用结构......我只是想办法保持我的代码干净且易于理解,而不影响性能。

最佳答案

您不能拥有 struct 的顶点着色器输入。

正确的方法是将它们粘贴在 vec4 中。如果您使用float[4],则需要四个属性而不是一个。数组的每个元素始终占用一个属性。因此,如果您在 float[4] TexSrc; 中执行 layout(location = 7);,这将占用属性索引 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 矢量的 float ,您仍然需要将它们打包到 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 是矩形的大小。而且它仍然只占用一个位置。

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

关于opengl - GLSL "in"结构体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9270954/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com