Opengl_入门学习分享和记录_03_渲染管线(二)再谈顶点着色器以及顶点属性以及属性链接
---恢复内容开始---
写在前面的废话:岂可修!感觉最近好忙啊,本来今天还有同学约我出去玩的。(小声bb)
正文开始:之前已经编译好的着色器中还有一些问题,比如
layout(location=0) in vec3 position;这句代码中layout (location= 0)的含义。今天我将详细介绍他的作用。
但是在这之前我想完善一下之前所说的 顶点数据 这个概念,由于之前的例子会给大家一种,顶点数据仅仅只是给出了顶点所在坐标系中位置这一种错觉,其实它还应该包含许多其他信息,这些所谓的信息则是描述我们顶点的有关信息,比如颜色和纹理等等。而这些顶点数据输入,当他们进入到顶点着色器后,会被着色器划分入不同的顶点属性位置。
Attentio:在进入到顶点着色器后,所有的数据都将被分成多组顶点属性,并且呈紧密排列,我们之前所用来定义坐标位置,颜色,纹理等信息的都将被分开并进入其中某一个顶点属性,多种顶点属性为一组叫顶点属性组。
现在我们再看之前那段代码,会有很多不同数据来描述对象不同的特性如颜色,位置,等等。我们要做的就是,将描述不同属性的数据放入同一组顶点属性,所以我们用layout关键字,他的作用是在顶点属性组中分配位置序号方便之后顶点数据进入特定的区域,这里把申明的变量 position(顶点属性--位置)的位置值设为0。这个location 0 仅是对与顶点着色器来说,,用于之后区分属性区。
分配好空间之后,我们就可以开始把顶点数组分组使其能够进入准确的顶点属性。说的抽象点就是:为顶点着色器解释说明我们的顶点数据输入究竟是怎么使用的。(哪些数据表示位置?哪些数据表示颜色,等)
如图所示:

接下来就是具体操作,我们用到的函数是glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0 ) 参数很多,我逐一解释。
首先第一个参数,表示存放的目的地为顶点着色器的location为0的位置。
第二个参数 3 表示我们一次性从VBO中取3个连续数据,放入location 。
第三个参数 GL_FLOAT 表示传入的这三个数据的 数据类型。
第四个 这个参数定义我们是否希望数据被标准化(Normalize)。如果我们设置为GL_TRUE,所有数据都会被映射到0(对于有符号型signed数据是-1)到1之间。我们把它设置为GL_FALSE。
第五个,表示步长。这里按我的理解,首先顶点着色器内部每次只有当我们要求它参与渲染,或者说画点的时候他才会再次从我们的VBO中读取生成一整套顶点属性组,但是我们的顶点数据又是按照一组一组顶点属性组的属性顺序来写入的,比如(3个float--位置, 3个float 颜色, 2个float渲染),当顶点着色器想要读取下一套时,读取数据用的pointer需要从上次的位置往后移动一套顶点属性组的长度之后,才可以读取下一套数据。
最后一个偏移量表示,每次我的指针读取完一个顶点属性后,他会回到数据开头位置,然后让其往后偏移一定数量的数据后才能继续读取下一个属性。比如当我们用了上述函数读取完位置属性之后,我们需要将指针从起始位置向后偏移3个数据长度后,才能继续读取下一组顶点属性。
这次暂时到这,估计下次更新会隔的比较久了。。
Opengl_入门学习分享和记录_03_渲染管线(二)再谈顶点着色器以及顶点属性以及属性链接的更多相关文章
- Opengl_入门学习分享和记录_03_渲染管线(三)借助顶点数组对象VAO提高绑定属性效率
目前我们已经知道了,如果想要顶点着色器解释理解我们的输入数据,就必须要按照以下繁琐的步骤:第一步:将输入的数据复制一份到缓冲区,供OpenGL使用.而这块新出现的区域由VBO管理和表示.(若有多个输入 ...
- Opengl_入门学习分享和记录_02_渲染管线(一)顶点着色器&片段着色器
写在前面的废话:今天俺又来了哈哈,真的好棒棒! 今天的内容:之前我们大概描述了,我们自己定义的顶点坐标是如何被加载到GPU之中,并且介绍了顶点缓冲对象VBO用于管理这一块内存.今天开始详细分析它的具体 ...
- Opengl_入门学习分享和记录_02_渲染管线(一)顶点输入
现在前面的废话:最近好事不断!十分开心!生活真美好! 好了今天要梳理一下,顶点输入的具体过程,同样也是渲染管线中的第一个阶段的详细过程的介绍.之前介绍过,OpenGL操作的是一组3D坐标,所以我们的输 ...
- Opengl_入门学习分享和记录_01_Graphics Pipeline(图形渲染管线)
写在前面的废话: 这个系列拖更了很久,很大一定程度上是由于自己最近忙着高数学习和线代学习..感觉时间特别紧缺(其实就是我太懒了)好了不废话了,总结开始. 正文开始: 首先Graphics Pipeli ...
- Opengl_入门学习分享和记录_00
2019.7.4 本着对游戏创作的热情,本人初步了解了一部分的unity引擎的使用,也学习了一点C#可是越学习unity我就反而对引擎内部感兴趣(不知道有没有一样的朋友=,=). 接着了解到了open ...
- Opengl_入门学习分享和记录_番外篇01(MacOS上如何在Xcode 开始编辑OpenGL)
写在前面的废话: 哈哈 ,我可真是勤勉呢,今天又来更新了,这篇文章需要大家接着昨天的番外篇00一起食用! 正文开始: 话不多说,先看代码. 这里主要全是使用的glfwwindowhint 这个函数,他 ...
- Opengl_入门学习分享和记录_番外篇00(MacOS上如何给Xcode 适配openGL)
现在前面的废话:哇这次没有鸽太久,突然想起来还没有介绍如何适配opengl的衍生库.今天一并介绍下,同样看时间允不允许,让我再把之前学到的一些东西再次总结一遍. 正文开始: 首先大家要知道我们的Ope ...
- Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十二章:几何着色器(The Geometry Shader)
原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十二章:几何着色器(The Geometry Shader) 代码工 ...
- Redis入门学习(学习过程记录)
Redis(入门笔记) 学习一个大的技术点,然后顺带着就把这个技术点的面试题给学习了. 学习完一个技术后,如果面试题还不能够解答的话,只能说明学的不精,需要查漏补缺. 下一个学习的方向:Redis-非 ...
随机推荐
- 嵊州D1T1 总统先生,一路走好!
嵊州D1T1 总统先生,一路走好! 在总统先生的所有财产就是 n 杯黑咖啡,咖啡店可以用 m 个空杯子换一杯黑咖啡. 因为总统的特殊身份,心地善良而心生怜悯的咖啡店店长决定先借给总统一杯黑咖啡,只要他 ...
- .Net Core 学习路由和请求参数传递
一.配置默认路由方式 {Controller=Home}/{action=Index}/{id?} 默认请求地址:http://localhost:xxx/home/index /id? 是可选项例如 ...
- Bzoj 3170[Tjoi 2013]松鼠聚会 曼哈顿距离与切比雪夫距离
3170: [Tjoi 2013]松鼠聚会 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1318 Solved: 664[Submit][Stat ...
- C程序中文标点惹的祸,你可长点儿心吧
想必你在编程时,即使写了一个很小很简短的程序,本以为编译一定不会有问题,自信满满,结果编译完了,编译器 给了几个大大的error,比如:error C2018: unknown character'0 ...
- 神经大条的我-->记录我那些容易忘记的知识点
1.springmvc中每次进来的request都是保存在ThreadLocal里的,所以不会存在线程问题.可以直接用@Autowired全局注入 参考地址:https://my.oschina.n ...
- MyBatis从入门到精通:第一章数据库创建文件
/*创建数据库mybatis,并指定编码方式为utf8,字符比较规则为utf8_general_ci*/ CREATE DATABASE mybatis DEFAULT CHARACTER SET u ...
- ASP.NET--Web服务器端控件和Html控件
今天学习总结了一些相关概念和知识. 之前无论是做 单机的winform 还是 CS的winform 感觉,不到两年下来感觉还可以,虽然API有很多,但是还是比较熟悉基于WINDOWS消息机制的编程,但 ...
- pycharm install python packaging tools时遇到AttributeError: '_NamespacePath' object has no attribute 'sort'错误
pycharm install python packaging tools时报错AttributeError: '_NamespacePath' object has no attribute 's ...
- 和朱晔一起复习Java并发(四):Atomic
本节我们来研究下并发包中的Atomic类型. AtomicXXX和XXXAdder以及XXXAccumulator性能测试 先来一把性能测试,对比一下AtomicLong(1.5出来的).LongAd ...
- [Linxu] Ubuntu下载mysql
//下载: sudo apt install mysql-server sudo apt install mysql-client sudo apt install libmysqlclient-de ...