OpenGL ES详解——glBufferData、glBufferSubData、glMapBuffer、glVertexAttribPointer方法、glTexImage2D介绍

目录

一、方法介绍

1、glBufferData方法

2、glBufferSubData方法

3、glMapBuffer方法

4、glVertexAttribPointer方法

5、glTexImage2D方法

6、glTexSubImage2D方法


一、方法介绍

1、glBufferData方法

使用glBufferData函数填充缓冲对象管理的内存,这个函数分配了一块内存空间,然后把数据存入其中。如果我们向它的data这个参数传递的是NULL,那么OpenGL只会帮我们分配内存,而不会填充它。如果我们先打算开辟一些内存,稍后回到这个缓冲一点一点的填充数据,有些时候会很有用。

2、glBufferSubData方法

调用glBufferSubData函数填充特定区域的缓冲,而不是一次填充整个缓冲。这个函数需要一个缓冲目标(target),一个偏移量(offset),数据的大小以及数据本身作为参数。这个函数新的功能是我们可以给它一个偏移量(offset)来指定我们打算填充缓冲的位置与起始位置之间的偏移量。这样我们就可以插入/更新指定区域的缓冲内存空间了。一定要确保修改的缓冲要有足够的内存分配,所以在调用glBufferSubData之前,调用glBufferData是必须的。

glBufferSubData(GL_ARRAY_BUFFER, 24, sizeof(data), &data); // 范围: [24, 24 + sizeof(data)]

3、glMapBuffer方法

把数据传进缓冲另一个方式是向缓冲内存请求一个指针,你自己直接把数据复制到缓冲中。调用glMapBuffer函数OpenGL会返回一个当前绑定缓冲的内存的地址,供我们操作:

float data[] = {
  0.5f, 1.0f, -0.35f
  ...
};

glBindBuffer(GL_ARRAY_BUFFER, buffer);
// 获取当前绑定缓存buffer的内存地址
void* ptr = glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);
// 向缓冲中写入数据
memcpy(ptr, data, sizeof(data));
// 完成够别忘了告诉OpenGL我们不再需要它了
glUnmapBuffer(GL_ARRAY_BUFFER);

调用glUnmapBuffer函数可以告诉OpenGL我们已经用完指针了,OpenGL会知道你已经做完了。通过解映射(unmapping),指针会不再可用,如果OpenGL可以把你的数据映射到缓冲上,就会返回GL_TRUE

把数据直接映射到缓冲上使用glMapBuffer很有用,因为不用把它储存在临时内存里。你可以从文件读取数据然后直接复制到缓冲的内存里。

4、glVertexAttribPointer方法

glVertexAttribPointer 是 OpenGL 中用于指定顶点属性数据的函数。这个函数在渲染过程中非常重要,因为它告诉 OpenGL 如何从你的缓冲区(Buffer)中读取顶点数据,并将其应用到顶点着色器(Vertex Shader)的输入变量上。

void glVertexAttribPointer(
    GLuint index,
    GLint size,
    GLenum type,
    GLboolean normalized,
    GLsizei stride,
    const GLvoid * pointer
);
  • index:指定要配置的顶点属性的索引。这个索引对应于顶点着色器中的 layout(location = X) 指定的位置。
  • size:指定每个顶点属性的组件数量。例如,对于位置属性,通常是 3(x, y, z),对于颜色属性,可能是 4(r, g, b, a)。
  • type:指定数组中每个组件的数据类型。常用的类型有 GL_FLOATGL_INTGL_UNSIGNED_INT 等。
  • normalized:当设置为 GL_TRUE 时,所有被读取的固定点数据类型(如 GL_BYTEGL_SHORTGL_INT 等)在被赋值到顶点着色器之前会被归一化(即转换为浮点型并映射到 [-1, 1] 或 [0, 1] 区间)。如果数据类型已经是浮点型(如 GL_FLOAT),则这个参数会被忽略。
  • stride:指定连续顶点属性组之间的偏移量(以字节为单位)。如果设置为 0,则 OpenGL 会假设所有的顶点属性都是紧密排列的(即没有间隔)。
  • pointer:这是一个指向当前绑定到 GL_ARRAY_BUFFER 目标的缓冲区对象中第一个组件的字节偏移量的指针。如果 pointer 是 NULL,则不会读取任何数据(这在某些情况下很有用,比如你想临时禁用某个顶点属性)。

在使用 glVertexAttribPointer 之前,你需要确保已经启用了相应的顶点属性数组,这可以通过 glEnableVertexAttribArray 函数实现:

glEnableVertexAttribArray(GLuint index);

此外,你还需要绑定一个包含顶点数据的缓冲区对象(通过 glBindBuffer(GL_ARRAY_BUFFER, buffer)),并确保在调用 glVertexAttribPointer 时,这个缓冲区对象是当前绑定的。

总结来说,glVertexAttribPointer 是 OpenGL 中用于配置如何从缓冲区读取顶点属性数据到顶点着色器的重要函数。正确配置这个函数是渲染 3D 图形的基础。

5、glTexImage2D方法

glTexImage2D方法,就是将纹理像素数据传递到片段着色器的方法。

6、glTexSubImage2D方法

glTexSubImage2DglTexImage2D作用很相似,但是使用方式有区别,glTexSubImage2D是用于修改纹理,即在一个纹理上只能第一次渲染glTexImage2D,而后面每帧的修改都用glTexSubImage2D,所以glTexSubImage2D用来渲染视频的每帧再适合不过,因为如果每帧都重新创建纹理,那效率实在太低了。

参考文章

高级数据 - LearnOpenGL-CN

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

闲暇部落

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值