glBufferSubData

本文详细介绍了glBufferSubData函数的使用方法,该函数用于更新OpenGL缓冲区对象中的一部分或全部数据。文中解释了各参数的意义及如何正确使用此函数进行数据更新。

glBufferSubData

glBufferSubData用来更新一个已有缓冲区对象中的一部分数据

void glBufferSubData(   
    GLenum target,
    GLintptr offset,
    GLsizeiptr size,
    const GLvoid * data);

参数:
target: 可以参考glBufferData中的描述,用来指定需要更新的缓冲区对象的类型

offset: 指定了更新数据相对于缓冲区对象中原始数据开始位置的偏移量,也就是说要从什么地方开始更新原来的数据(以字节为单位)

size:需要更新的数据量的大小

data:一个指向新数据源的指针,将新的数据源拷贝到缓冲区对象中完成更新

描述:
glBufferSubData用来更新缓冲区对象中的数据,可以更新一部分或者整个缓冲区中的数据(取决于offset和size的取值),如果offset是0,而size正好是用来缓冲区存储数据的大小,那么整个数据就会被新的数据所替换。需要注意的是offset和size必须保证在原来缓冲区对象可以表示的范围之内。(加入原来缓冲区对象中存储了1024个字节,那么offset就不能大于1024,因为这样的话就没法更新数据了)

#include "Hexagon.h" #include <glad/glad.h> #include <iostream> Hexagon::Hexagon() : VAO(0), VBO(0) {} Hexagon::~Hexagon() { if (VAO) glDeleteVertexArrays(1, &VAO); if (VBO) glDeleteBuffers(1, &VBO); } void Hexagon::initData() { HexVertex vertices[6] = { { glm::vec3(0.0f, 0.8f, 0.0f), glm::vec3(1.0f, 0.0f, 0.0f) }, { glm::vec3(0.5f, 0.4f, 0.0f), glm::vec3(0.0f, 1.0f, 0.0f) }, { glm::vec3(0.5f, -0.4f, 0.0f), glm::vec3(0.0f, 0.0f, 1.0f) }, { glm::vec3(0.0f, -0.8f, 0.0f), glm::vec3(1.0f, 1.0f, 0.0f) }, { glm::vec3(-0.5f, -0.4f, 0.0f), glm::vec3(0.0f, 1.0f, 1.0f) }, { glm::vec3(-0.5f, 0.4f, 0.0f), glm::vec3(1.0f, 0.0f, 1.0f) } }; glGenVertexArrays(1, &VAO); glGenBuffers(1, &VBO); glBindVertexArray(VAO); glBindBuffer(GL_ARRAY_BUFFER, VBO); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); glEnableVertexAttribArray(0); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(HexVertex), (void*)0); glEnableVertexAttribArray(1); glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(HexVertex), (void*)offsetof(HexVertex, color)); glBindBuffer(GL_ARRAY_BUFFER, 0); glBindVertexArray(0); } void Hexagon::renderObject() { glBindVertexArray(VAO); glDrawArrays(GL_TRIANGLE_FAN, 0, 6); glBindVertexArray(0); } void Hexagon::updateDataBuffer() { HexVertex newColors[2] = { { glm::vec3(), glm::vec3(1.0f, 1.0f, 1.0f) }, { glm::vec3(), glm::vec3(0.5f, 0.5f, 0.5f) } }; glBindBuffer(GL_ARRAY_BUFFER, VBO); glBufferSubData(GL_ARRAY_BUFFER, sizeof(HexVertex) * 2, sizeof(newColors), newColors); glBindBuffer(GL_ARRAY_BUFFER, 0); } 解释每一行代码,每一行都要解释
最新发布
09-25
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值