c++ - 我正在努力理解着色器中的某些内容
问题描述
我正在 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
解决方案
所以在这里他指定了如何读取包括第一个位置属性索引的缓冲区,那么为什么他还需要像上面一样在着色器中指定它?
确切地指定着色器中的内容?该值是一个 4 元素向量?好吧,shader 属性指定的对应类型并不要求与 VAO 提供的类型完全相同。您可以传递整数,这些整数可以通过规范化或仅“强制转换”转换为浮点数。等等。
从您的示例中可以看出,着色器中指定的组件数量甚至不必与数组提供的数量相匹配。您的数组为此属性发送 2 个组件,但着色器需要 4 个。这很好;相应属性中的最后两个值将是 0 和 1。
您是在谈论名称position
映射到属性 0 吗?那么,系统如何知道从属性 0 读取的数组元素进入了一个名为position
. 0 对系统没有任何意义,除了索引;如果没有该layout(location
部件,系统将无法判断将从阵列读取的数据发送到何处。
最后也是最重要的...glVertexAttribPointer
修改顶点数组对象,而不是着色器。那么,如果链接程序存储在其他对象中,它应该如何知道这些东西呢?如果您没有在着色器中为其分配某个名称,您将如何编写将数组中的位置乘以矩阵?
不,该着色器中的每条信息都需要在那里。它不是多余的。
推荐阅读
- javascript - socket.remoteAddress 返回 ::1?
- php - PHP 数组发送 React Native Fetch
- android - Android Studio 3.6 canary 4 - Gradle 抛出 DefaultProjectSyncIssues 异常
- css - 为什么背景起源在体内不起作用
- flutter - 如何防止每次在flutter中点击底部导航栏页面时调用http请求?
- laravel - Laravel Websanova/Vue-Auth 登录/注册返回未定义的 URL
- android - 行小部件使用整个列
- python - 如何替换熊猫数据框中的数值?
- sql - 在一个联接中匹配多个列
- maven - `mvn clean install`一个che插件项目时“发现依赖问题”