首页 > 解决方案 > 我正在努力理解着色器中的某些内容

问题描述

我正在 youtube 上观看 opengl 的 thechernoproject 教程,并在 opengl 情节中编写着色器时,他使用以下行定义了位置属性的开始位置在着色器中的位置:

layout(location = 0) in vec4 positions;

但我的问题是,他为什么需要这样做,因为当他以前使用 glVertexAttribPointer 时肯定是这样的:

glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 2, 0);

所以在这里他指定了如何读取包括第一个位置属性索引的缓冲区,那么为什么他还需要像上面一样在着色器中指定它?

您可以在视频中的 23:22 看到所有这些代码:https ://www.youtube.com/watch?v=71BLZwRGUJE&index=7&list=PLlrATfBNZ98foTJPJ_Ev03o2oq3-GGOS2

标签: c++openglshader

解决方案


所以在这里他指定了如何读取包括第一个位置属性索引的缓冲区,那么为什么他还需要像上面一样在着色器中指定它?

确切地指定着色器中的内容?该值是一个 4 元素向量?好吧,shader 属性指定的对应类型并不要求与 VAO 提供的类型完全相同。您可以传递整数,这些整数可以通过规范化或仅“强制转换”转换为浮点数。等等。

从您的示例中可以看出,着色器中指定的组件数量甚至不必与数组提供的数量相匹配。您的数组为此属性发送 2 个组件,但着色器需要 4 个。这很好;相应属性中的最后两个值将是 0 和 1。

您是在谈论名称position映射到属性 0 吗?那么,系统如何知道从属性 0 读取的数组元素进入了一个名为position. 0 对系统没有任何意义,除了索引;如果没有该layout(location部件,系统将无法判断将从阵列读取的数据发送到何处。

最后也是最重要的...glVertexAttribPointer修改顶点数组对象,而不是着色器。那么,如果链接程序存储在其他对象中,它应该如何知道这些东西呢?如果您没有在着色器中为其分配某个名称,您将如何编写将数组中的位置乘以矩阵?

不,该着色器中的每条信息都需要在那里。它不是多余的。


推荐阅读