问题标签 [vertex-attributes]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
39 浏览

opengl - 为什么顶点属性数据的“顺序”排列会导致崩溃?

我有一个带有着色器的 OpenGL 应用程序,可以渲染带有纹理的对象。

当我创建具有“交错”属性的简单矩形时,如下所示:

然后应用程序工作,正方形按预期使用其纹理进行渲染。

但是如果我使用顶点属性的顺序排列:

然后我的应用程序在调用中崩溃

两个 VAO 的处理方式完全相同 - 唯一的区别是 glBindVertexArray() 在绘制之前的参数:交错或顺序 VAO。

如果我注释掉纹理属性的创建,则顺序 VAO 不会导致崩溃。

我在“顺序”版本中做错了什么?

(编辑:拼写错误)

0 投票
2 回答
324 浏览

shader - InputLayout 将顶点属性绑定到常量值?

我正在尝试将一些代码从 OpenGL 移植到 DirectX - 在 OpenGL 中,可以禁用某个顶点属性并将其设置为常量值。

这非常有用,即如果着色器需要颜色的顶点属性,我可以通过这种方式传递一个常量值,而不是将每个顶点复制的相同颜色放在顶点缓冲区中。

在 DirectX 中,需要创建一个ID3D11InputLayout与着色器匹配的对象,例如:

但是如果 InputLayout 没有覆盖着色器期望的所有顶点属性,则会出现运行时异常。

基本上我想在输入布局中省略某个顶点属性,并将着色器中的属性值设置为常量值。我目前只能看到以下解决方案(每个都有很大的缺点):

  • 为常量颜色创建单独的着色器(来自常量缓冲区/统一而不是属性)→但这将导致额外的着色器对象和额外的着色器代码需要维护
  • 为每个顶点复制相同颜色的顶点属性→但这会浪费大量内存

还有其他解决方案吗?DirectX 中处理此类情况的最佳实践是什么?

0 投票
2 回答
4236 浏览

opengl - What is the difference between glVertexAttribDivisor and glVertexBindingDivisor?

I was looking for ways to associate attributes with arbitrary groupings of verticies, at first instancing appeared to be the only way for me to accomplish this, but then I stumbled up this question and this answer states :

However what is possible with newer versions of OpenGL is setting the rate at which a certain vertex attribute's buffer offset advances. Effectively this means that the data for a given vertex array gets duplicated to n vertices before the buffer offset for a attribute advances. The function to set this divisor is glVertexBindingDivisor.

(emphasis mine)

Which to me seems as if the answer is claiming I can divide on the number of vertices instead of the number of instances. However, when I look at glVertexBindingDivisor's documentation and compare it to glVertexAttribDivisor's they both appear to refer to the division taking place over instances and not vertices. For example in glVertexBindingDivisor's documentation it states:

glVertexBindingDivisor and glVertexArrayBindingDivisor modify the rate at which generic vertex attributes advance when rendering multiple instances of primitives in a single draw command. If divisor is zero, the attributes using the buffer bound to bindingindex advance once per vertex. If divisor is non-zero, the attributes advance once per divisor instances of the set(s) of vertices being rendered. An attribute is referred to as instanced if the corresponding divisor value is non-zero.

(emphasis mine)

So what is the actual difference between these two functions?

0 投票
1 回答
393 浏览

c++ - OpenGL 顶点着色器在 Linux 上很快,但在 Windows 上非常慢

为了绘制信号的功率谱密度(与热图非常相似),我使用了这个顶点着色器程序。它接收每个顶点的功率值,取对数以 dB 为单位显示结果,在颜色图数组的范围内进行归一化,并为顶点分配颜色。

对应的C++代码在这里:

这个程序在 Linux 上运行得足够快。但在 Windows 中,它非常慢并且占用大量 CPU 时间。如果我更改这行 GLSL:

然后该应用程序也可以在 Windows 上快速运行。所以,这一定是GLSL代码的问题。

我应该如何解决它?

0 投票
2 回答
2979 浏览

opengl - OpenGL GLSL 将颜色作为整数发送到着色器以分解为 vec4 RGBA

我可以将颜色作为 4 个浮点数发送到着色器 - 没问题。但是我想将它作为整数(或无符号整数,并不重要,重要的是 32 位)发送并在着色器上的 vec4 中分解。

我使用 OpenTK 作为 OpenGL 的 C# 包装器(尽管它应该只是一个直接包装器)。

让我们考虑一个最简单的着色器,它的顶点包含位置(xyz)和颜色(rgba)。

顶点着色器:

片段着色器:

让我们创建顶点缓冲区:

我在顶点着色器中得到了 vec4 'in_color' 的全零。不知道出了什么问题。

我发现的最接近的东西:https ://www.opengl.org/discussion_boards/showthread.php/198690-I-cannot-send-RGBA-color-as-unsigned-int 。

同样在 VertexAttribIPointer 中,我将 0 作为步幅传递,因为我确实有 VertexBufferArray 并保持数据分离。因此,每个顶点的颜色紧密排列为 32 位(每种颜色)。

0 投票
1 回答
137 浏览

opengl - 关于使用 glVertexAttribPointer 绑定不存在属性的索引的困惑

使用 glVertexAttribPointer 绑定属性索引时,如果关联程序在所述索引处不包含属性,会发生什么情况?

行为是未定义的,还是完全忽略了该属性?

我已经对文档进行了相当广泛的搜索,但无法找到有关程序和动态属性绑定之间链接的大量信息。

0 投票
1 回答
101 浏览

c++ - glVertexAttribPointer() 的索引应该是连续的吗?

glVertexAttribPointer()的第一个参数是表示顶点属性所在位置的索引,Opengl 提供至少 16 个插槽。

我希望所有 16 个代表不同的顶点属性(位置 = 0、uvs = 1、颜色 = 3、权重 = 8 等),并且这些属性在每个顶点类型中都是恒定的,即使顶点不使用该属性。

我的问题是,如果索引对于给定的顶点不连续,这有什么关系吗?例如,这会不会是低效的:

0 投票
1 回答
65 浏览

java - 不能同时运行两个着色器程序,但是单独使用时每个都可以正常工作

好吧,这已经扼杀了 2 天。我有一个小的 GLES2/Android 应用程序......两个对象(都是正方形,但只有一个具有纹理坐标)。我有两个着色器程序,一个处理纹理及其坐标,另一个只在片段着色器中使用颜色。

当我只尝试渲染其中一个对象(并且只编译和链接一个着色器程序)时,一切正常,当我为这两个对象执行此操作时,仅渲染第二个对象(纹理正方形)。是的,我在渲染相应对象之前确实切换了着色器程序。值得注意的一件事。当我调试时;一个着色器程序中的顶点属性指针 = 0 = 下面另一个程序中的纹理属性指针是一些代码,感谢任何帮助

0 投票
1 回答
35 浏览

c - 关于 glVertexAttribPointer 索引参数的说明

我有一个非常简单的程序来在 OpenGL 中显示一个 3D 三角形。我输入的帽子值,它没有正确显示。我将以下数组放入顶点缓冲区

我使用以下内容将它们传递给顶点着色器

但是输出三角形有一个奇怪的蓝色区域,即使位置是正确的,这没有意义,因为输入颜色应该是黑色的。我看到有些人使用索引作为 sizeof(float) * 3 和 sizeof(float) * 4,但这会使三角形变为绿色并导致位置错误。docs.gl 条目非常模糊,没有提供任何示例。这是我的着色器

片段着色器

这里有什么问题?

0 投票
1 回答
108 浏览

c++ - C++ directx 11如何交错未知数量的顶点属性

我读过很多文章说通过将数据放入结构中来交错顶点属性

这适用于教程,但适用于从 obj、colladae 文件等加载的真实世界模型。不可能预先知道网格包含多少属性,并且您无法编写包含所有可能属性组合的所有可能结构。

唯一的解决方案是先读取所有属性,然后将它们合并到一个大数组中。

问题是我尝试了这种方法,但它不起作用。

那么如何交错仅在运行时才知道的未知数量的属性呢?INPUT_LAYOUT_DESC 中的 alignbyteoffset 应该是什么?如何交错数据 OpenGL 样式?