OpenGL3.3_C++_Windows(16)

理解缓冲:

  1. glGenBuffers生成指定个数缓冲区对象的名称(唯一id),并不具备任何意义
  2. glBindBuffer缓冲对象的名称绑定到缓冲目标(opengl有很多目标点类型),就像在指定的缓冲类型中启用了这个id的开关(设置为激活对象),作为缓冲类型其中的某一个对象,之后的任何调用都会用来配置当前绑定的id
  3. glBufferData为当前绑定的id分配 内存 + 数据

其他操作缓冲函数:

  1. 1·glBufferData()会分配一块内存,并将数据添加到这块内存中。它的data参数设置为NULL,那么这个函数将只会分配内存,但不进行填充

如何一点一点填充:

  1. 首先使用glBufferData()分配内存不填充,glBufferSubData()填充缓冲的特定区域,需要偏移量,指定从何处开始填充这个缓冲。
  2. 范围 = offest + sizeof(*data)

数据拷贝到缓冲:

  1. 2·glMapBuffer()请求当前绑定缓冲内存的指针,memcpy()直接将数据复制到缓冲当中:,glUnmapBuffer()解除映射,指针将会不再可用,

顶点数据布局:

  1. 与交错布局123123123123不同,我们将采用分批的方式111122223333
  2. 含义:这样子我们就能直接将属性数组作为一个整体传递给缓冲,仍可以将它们合并为一个大的数组,哪种方法都不会对OpenGL有什么立刻的好处,它只是设置顶点属性的一种更整洁的方式。具体使用的方法将完全取决于你的喜好与程序类型。
  3. 对于布局,更改的是 步长(Stride) (表示下一个顶点的这个属性,出现在当前起始点位置 +  stride后)&&  起始位置的偏移量(Offset)(数据相对于缓冲中)
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), 0);  
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)(sizeof(positions)));  
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float), (void*)(sizeof(positions) + sizeof(normals)));
  1. 理解交错布局:最开始的起始位置Offset,每个属性的每次的起始点偏移stride,每个属性的字节大小
  2. 理解分批布局:它的起始位置偏移应该是整个属性数组,每次起始点偏移,非原来的一个顶点大小,变为了当前的顶点字节,其他不变

共享缓冲数据(读写):

  1. glCopyBufferSubData能够让我们相对容易地从一个缓冲中复制数据到另一个缓冲中。
  2. 参数:复制源缓冲目标(读),复制目标的缓冲目标(写),源偏移量,目标偏移量,大小   
  3. 如果想读写同一个缓冲目标,glCopyBufferSubData的前两个参数不能为同一个
  4. OpenGL提供给我们另外两个缓冲目标GL_COPY_READ_BUFFER,GL_COPY_WRITE_BUFFER缓冲目标
  5. 注意:在调用glCopyBufferSubData之前,需要glBindBuffer,激活缓冲目标中的缓冲id
  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值