我正在努力理解着色器中的某些内容

Posted

技术标签:

【中文标题】我正在努力理解着色器中的某些内容【英文标题】:I am struggling to understand and something in shaders 【发布时间】:2018-08-07 04:49:44 【问题描述】:

我正在 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

【问题讨论】:

【参考方案1】:

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

确切地指定着色器中的内容?该值是一个 4 元素向量?好吧,shader 属性指定的对应类型并不要求与 VAO 提供的类型完全相同。你可以通过integers which can get converted to floats via normalization or just "casting"。以此类推。

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

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

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

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

【讨论】:

好的,谢谢,但着色器首先如何访问缓冲区,因为实际上并没有提供给着色器的缓冲区 @adamtheguy762:着色器根本不“访问缓冲区”。顶点属性由系统提供给着色器。 好的,但是如果您有大量缓冲区,系统如何知道为着色器提供正确的缓冲区 @adamtheguy762:因为you told it do。这就是glVertexAttribPointer 所做的。这就是 VAO 的全部目的。 @adamtheguy762:我已经在这个答案中告诉过你它的目的。如果您还有其他问题,请使用该按钮。但是请尝试使用您的可用资源为自己解决问题。并停止观看糟糕的视频教程。

以上是关于我正在努力理解着色器中的某些内容的主要内容,如果未能解决你的问题,请参考以下文章

在顶点和片段着色器中访问同名统一失败

顶点着色器中的 Phong 光照

着色器中的 OpenGL 法线变换

在着色器中使用 glTexture

OpenGL 计算着色器中的样本深度缓冲区

片段着色器中的OpenGL点精灵旋转