首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用glBufferData编辑OpenGL VBO会删除部分数据

glBufferData函数是OpenGL中用于创建和初始化顶点缓冲对象(VBO)的函数之一。它可以用来分配内存并将数据复制到VBO中。然而,使用glBufferData函数编辑VBO时,会删除VBO中的部分数据。

具体来说,glBufferData函数的作用是重新分配VBO的内存空间,并将新的数据复制到VBO中。如果VBO中原有的数据不再被新的数据所覆盖,那么这部分原有数据将会被删除。

这种行为可能会导致数据丢失或者不一致的问题。为了避免这种情况发生,我们可以使用glBufferSubData函数来编辑VBO,而不是使用glBufferData函数。glBufferSubData函数可以在不删除原有数据的情况下,仅仅更新VBO中的部分数据。

总结一下,使用glBufferData函数编辑OpenGL VBO会删除部分数据,可能导致数据丢失或者不一致的问题。为了避免这种情况,建议使用glBufferSubData函数来编辑VBO。

关于OpenGL和VBO的更多信息,您可以参考腾讯云的OpenGL产品文档:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

OpenGL学习笔记 (二)- 顶点与绘制指令

OpenGL采用了数学中“正向”的概念,也就是说对于(凸)多边形的正面,从屏幕上观察,它的顶点是以逆时针排列的。 顶点 顶点(vertex)实际上就是坐标,是几何图元的组成部分。...在OpenGL中,使用四个分量(齐次坐标)来描述一个位置。不过,一个顶点还可以同时具备其他的数据,比如顶点处的法向量、对应的纹理坐标等等。 OpenGL缓冲 现代OpenGL广泛应用缓冲。...之后我们就需要使用glBufferData来真正的传输数据了。glBufferData的对象并不是缓冲对象名称,而是一个目标。...由于现代OpenGL的顶点数据都存在于缓冲对象中(曾经可以使用glVertexPointer函数),所以现在VAO已经不自带数据了,因此它需要绑定一个VBO。...交叉存储的顶点数据(图源Reference) 不过交叉存储也是有缺点的。在对齐的时候,交叉存储消耗更多空间。此外,交叉存储是否能提升效率还有待数据验证。

1.6K10

一看就懂的 OpenGL 基础概念(3):各种 O 之 VBO、EBO、VAO丨音视频基础

7.1、VBO 和 EBO 在 OpenGL 开发中,用于绘制的顶点数据首先是存储在 CPU 内存中的,比如我们在《RenderDemo(1):用 OpenGL 画一个三角形》中的三角形的 3 个顶点数据..., VBO); // 把新创建的 VBO 绑定到 GL_ARRAY_BUFFER 目标上,同时也绑定到了 OpenGL 渲染管线上 glBufferData(GL_ARRAY_BUFFER, sizeof...在《RenderDemo(1):用 OpenGL 画一个三角形》的 iOS Demo 中我们用到了 VBO。 2)我们接着来看看 EBO 的使用: 假设我们不再绘制一个三角形而是绘制一个矩形。...对象 glBindBuffer(GL_ARRAY_BUFFER, VBO); // 把新创建的 VBO 绑定到 GL_ARRAY_BUFFER 目标上,同时也绑定到了 OpenGL 渲染管线上 glBufferData..., VBO); // 把顶点数组复制到缓冲中供 OpenGL 使用 glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW

1.1K10
  • 【C++】OpenGL:着色器基础与GLFW创建三角形示例

    ,这也是所有OpenGL高级效果产生的地方 片段着色器确定好所有元素的颜色值后,进入测试混合阶段,主要检测元素的深度值等信息 顶点输入 开始绘制图形之前,我们需要先给OpenGL输入一些顶点数据。...我们可以使用glGenBuffers函数和一个缓冲ID生成一个VBO对象: unsigned int VBO; glGenBuffers(1, &VBO); OpenGL有很多缓冲对象类型,顶点缓冲对象的缓冲类型是...glDeleteShader(fragmentShader); //删除片段着色器 链接顶点属性和VAO顶点数组对象 我们必须告诉OpenGL如何去解析顶点数据,我们使用一个顶点缓冲对象将顶点数据初始化至缓冲中...在OpenGL中绘制一个物体,代码像是这样: // 0....复制顶点数组到缓冲中供OpenGL使用 glBindBuffer(GL_ARRAY_BUFFER, VBO); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices

    15810

    音视频面试题集锦 2022.09

    4)为什么离屏渲染造成性能损耗? 当使用离屏渲染的时候很容易造成性能消耗,因为离屏渲染单独在内存中创建一个屏幕外缓冲区并进行渲染,而屏幕外缓冲区跟当前屏幕缓冲区上下文切换是很耗性能的。...图形渲染管线可以大致被划分为两个主要部分:第一部分把你的 3D 坐标转换为 2D 坐标;第二部分是把 2D 坐标转变为实际的有颜色的像素。 6)OpenGL 渲染管线主要包含哪些部分?...OpenGL 渲染管线中着色器允许开发者自己配置,这样我们就可以使用 GLSL(OpenGL Shading Language)来编写自己的着色器替换默认的着色器,从而更细致地控制图形渲染管线中的特定部分...9)什么是 VBO、EBO 和 VAO? 可以认为它们是在 OpenGL 中处理数据的三大类缓冲内存对象。...; glGenBuffers(1, &VBO); glBindBuffer(GL_ARRAY_BUFFER, VBO); glBufferData(GL_ARRAY_BUFFER, sizeof

    1.1K20

    1.opengl绘制三角形

    就像OpenGL中的其它对象一样,这个缓冲有一个独一无二的ID,所以我们可以使用glGenBuffers函数和一个缓冲ID生成一个VBO对象: unsigned int VBO; glGenBuffers...它有三种形式: GL_STATIC_DRAW :数据不会或几乎不会改变(一次修改,多次使用) GL_DYNAMIC_DRAW:数据频繁修改(多次修改,多次使用) GL_STREAM_DRAW :数据每次绘制时都会改变...(每帧都不同,一次修改,一次使用) 现在我们已经把顶点数据储存在显卡的内存中,用VBO这个顶点缓冲对象管理。...下面我们创建一个顶点和片段着色器来真正处理这些数据。...把顶点数组复制到缓冲中供OpenGL使用 glBindBuffer(GL_ARRAY_BUFFER, VBO); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices

    1.2K30

    OpenGL自制游戏引擎-HelloTriangle

    顶点着色器接着处理我们在内存中指定数量的顶点。 通过顶点缓冲对象(Vertex Buffer Objects, VBO)管理这个内存,它会在GPU内存(通常被称为显存)中储存大量顶点。...就像OpenGL中的其它对象一样,这个缓冲有一个独一无二的ID,所以我们可以使用glGenBuffers函数和一个缓冲ID生成一个VBO对象: unsigned int VBO; glGenBuffers...glBufferData是一个专门用来把用户定义的数据复制到当前绑定缓冲的函数。...unsigned int VBO; glGenBuffers(1, &VBO); glBindBuffer(GL_ARRAY_BUFFER, VBO); glBufferData...有了这些信息我们就可以使用glVertexAttribPointer函数告诉OpenGL该如何解析顶点数据使用glEnableVertexAttribArray,以顶点属性位置值作为参数,启用顶点属性

    1.4K20

    OpenGL现代编程第二课——第一个多边形

    下面串接一下上面的概括: 开始绘制图形之前,我们必须先给OpenGL输入一些顶点数据,当然,这些数据是有范围限制的,如范围是-1.0f到1.0f,数据需要是三维的等等。...经过我们手动指定输入数据的哪一个部分对应顶点着色器的哪一个顶点的属性后,之后数据就可以传递给顶点着色器了。...首先要做的第一件事是用着色器语言GLSL(OpenGL Shading Language)编写顶点着色器,然后编译着色器,之后才能在程序中使用它。...,这样批量处理比较科学化,所以就有了VBO对GPU内存的管理;OK,土豆数量够了,接下来把合格的土豆送往各部分土豆切割器,三个土豆变成了N多土豆片,再“编译”土豆片一下,土豆切割部分就完成了;片段着色器就是土豆片口味区分的部分了...glDeleteShader(fragmentShader); //VAO,VBO数据部分 #ifdef TRIANGLE GLfloat vertices[] = {

    71810

    OpenGL与CUDA互操作方式总结

    本人主管的项目中采用了OpenGL做图像渲染,但是在数据处理方面比较慢,导致帧率一直上不来。于是就尝试把计算工作分解成小的任务,使用核函数在CUDA中加速计算。...一般这种情况下注册的是VBO和PBO,VBO一般用于存储顶点坐标、索引等数据;PBO则一般用于存储图像数据,因此称作Pixel Buffer Object。...CUDA核函数中进行处理 CUDA释放资源,在OpenGL使用Buffer Object 下面就以代码为例,讲讲两种方式的异同: (1)OpenGL PBO/VBO在CUDA中的使用 // 初始化Buffer...后即在CUDA中注册Buffer Object glBindBuffer(GL_ARRAY_BUFFER, this->VBO[0]); glBufferData(GL_ARRAY_BUFFER, sizeof...[0], cudaGraphicsRegisterFlagsNone); glBindBuffer(GL_ARRAY_BUFFER, this->VBO[1]); glBufferData(GL_ARRAY_BUFFER

    2.2K61

    OpenGL 从入门到成魔-第4章-VAO 和 VBO

    注:参考自bilibili系列视频,OpenGL 从入门到成魔-第4章-VAO 和 VBO https://www.bilibili.com/video/BV1zt4y1C7dh OpenGL中的坐标系...告诉openGL,当前操作的VBO是哪个 glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); 复制顶点数组到缓冲中供...OpenGL使用 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0); 告诉OpenGL该如何解析顶点数据...这里参数值应为0,因为在第三步中设置了将数据传递到位置为0的顶点属性中。顶点属性(Vertex Attribute)就是每个输入变量。 glDeleteBuffers() 释放VBO VAO ?...由于OpenGL是个状态机,当绑定当前VAO之后,后面的VBO操作自然而然的都是在该VAO上进行的。 glDeleteVertexArrays 释放VAO

    1.1K40

    NDK OpenGL ES 3.0 开发(二十二):PBO

    OpenGL PBO(像素缓冲区对象) 类似于 VBO(顶点缓冲区对象),PBO 开辟的也是 GPU 缓存,而存储的是图像数据。...为什么要用 PBO 在 OpenGL 开发中,特别是在低端平台上处理高分辨率的图像时,图像数据在内存和显存之前拷贝往往造成性能瓶颈,而利用 PBO 可以在一定程度上解决这个问题。...不使用 PBO 加载纹理 上图从文件中加载纹理,图像数据首先被加载到 CPU 内存中,然后通过 glTexImage2D 函数将图像数据从 CPU 内存复制到 OpenGL 纹理对象中 (GPU 内存)...绑定为 GL_PIXEL_UNPACK_BUFFER 表示该 PBO 用于将像素数据从程序传送到 OpenGL 中;绑定为 GL_PIXEL_PACK_BUFFER 表示该 PBO 用于从 OpenGL...2 个 PBO 和不使用 PBO 加载图像数据到纹理对象的耗时差别: 使用 2 个 PBO 加载图像数据的耗时 不使用 PBO 加载图像数据的耗时 使用两个 PBO 从帧缓冲区读回图像数据 使用两个

    2.6K51

    openGL 入门 2--顶点数组对象 VAO 和 缓存对象 VBO

    它会在GPU上创建内存用于储存我们的顶点数据,还要配置OpenGL如何解释这些内存,并且指定其如何发送给显卡。顶点着色器接着处理我们在内存中指定数量的顶点。...使用这些缓冲对象的好处是我们可以一次性的发送一大批数据到显卡上,而不是每个顶点发送一次。从CPU把数据发送到显卡相对较慢,所以只要可能我们都要尝试尽量一次性发送尽可能多的数据。...When binding to a buffer value of zero, OpenGL stops using buffer objects for that target....,与 VBO 关联 glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW); // 分配缓存对象所需的内存,...将顶点对象的数据 拷贝到 缓存对象 内存中

    1K20
    领券