glVertexAttrib与glVertexAttribPointer的区别

4

我正在学习着阅读和理解着着色器,但是在将信息传递给着色器时突然感到困惑。

glVertexAttribglVertexAttribPointer之间有什么区别?它们的使用时间不同吗?它们只是完成同一件事的两种不同方式吗?其中一种提供更好或更差的性能吗?


相关链接:https://dev59.com/NGsz5IYBdhLWcg3wsaEN(虽然不确定是否可以视为重复问题)。 - Christian Rau
谢谢你指引我那个。它非常相似。在OpenGL中很难找到简单的答案。即使《红皮书》(至少第7版)也混杂了已弃用的方法,并且没有很好地突出显示哪些是已弃用的、哪些函数是替代了弃用函数的新函数等等…… - David Torrey
1
是的,确实(而且可悲的是),《红皮书》不再是学习OpenGL的唯一资源了,正如你所描述的那样。要么只学习现代的东西,从未涉及过废弃的内容(这是我建议完全新手的做法),要么先学习废弃的内容,然后再学习在现代OpenGL中替代它们的内容。但是,《红皮书》混合这些内容的方法并不是最好的。如果你想要一本专注于面向未来特性(GL 3+核心)的现代书籍,我建议阅读Superbible最新版本。 - Christian Rau
有一本新的红色书涉及GL 4+。 - Bartek Banachewicz
1
@BartekBanachewicz,目前的第七版也解释了现代事物(GL 3+),但以同样的方式描述了所有已弃用的内容。这导致几乎每个章节的顶部都有句子“本章描述的许多技术和函数已通过弃用删除”,这只是垃圾。因此,我们将看看第八版如何处理,但我怀疑它不会更好,因为为了完整性,即使出于教学目的,他们也不会放弃旧的东西。但也许这一次他们会更清晰地结构化。 - Christian Rau
显示剩余2条评论
1个回答

4

glVertexAttrib 设置给定一组顶点的属性的

glVertexAttribPointer 为每个顶点设置属性的位置

因此,这两个函数本质上是不同的,无法在速度方面进行比较。无论如何,在大多数渲染应用中,设置属性指针并不是瓶颈。


那么这是否意味着 VertexAttribPointer 主要用于 VBO,而 VertexAttrib 则用于发送特定的应用程序变量? - David Torrey
更多或更少,是的。您可以使用“指针”创建一个具有混合RGB颜色的三角形,并使用“属性”创建一个蓝色三角形 :) - Bartek Banachewicz
那么,由于vertexattrib需要到应用程序中提取变量,然后将其发送到GLSL,它会受到多大的影响?使用指针是没有问题的,因为它在VBO中。是否可以将自定义信息(例如告诉GLSL将三角形渲染为蓝色的变量)放入同一VBO中,然后通过指针或其他函数传递给GLSL呢? - David Torrey
我上面所说的意思是,假设我有5个对象都使用相同的网格。我会将顶点位置、法线等存储到VBO中并传递过去。如果我想为每个对象使用单独的纹理呢?是否可以通过VBO将对象状态发送到GLSL,以便它知道要提取哪个纹理? - David Torrey
1
@BartekBanachewicz 嗯,严格来说,纹理/采样器本身不是每像素的,而是每对象(或者更确切地说是每次绘制),你对它所做的操作是每像素的,但是在片段着色器中完成的所有操作也都是每像素的。 - Christian Rau
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接