您当前的位置: 首页 >  缓存

Jave.Lin

暂无认证

  • 5浏览

    0关注

    704博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

OpenGL API - glMapBuffer - 可用于获取缓存对象指针

Jave.Lin 发布时间:2020-07-31 11:59:07 ,浏览量:5

因为有需要对网格顶点属性实时更新,所以我之前使用的 API 是:glBufferData

// method 1:
glBindBuffer(GL_ARRAY_BUFFER, vbos[(int)MeshVboType::POSITION]);
glBufferData(GL_ARRAY_BUFFER, arr->bytes_size(), arr->ptr(), _dynamic ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW);
checkGLError();

但是从 API 参数可以看到,它需要获取 GL_ARRAY_BUFFER 类型缓存的指针,指定分配大小,并设置数据,并指定缓存区块是类型。

对于我们只需要更新数据来说,这个 API 做的东西过多了。

然后,我在继续学习 LearnGL 系列的过程中,法线另一对 API: glMapBuffer、glUnmapBuffer,这对 API 正式我需要的功能,我的学习项目中的代码如下:

	void Mesh::uploadPos(FixedArray* arr) {
		if (!_uploaded) return;
		if (arr != _vertices) {
			assert(arr != NULL);
			DESTROY(_vertices);
			_vertices = arr;
			pos_copy_from(arr->ptrType(), arr->size());
			// 新的缓存
			// vbo
			glBindBuffer(GL_ARRAY_BUFFER, vbos[(int)MeshVboType::POSITION]);
			// pos
			glBufferData(GL_ARRAY_BUFFER, _vertices->bytes_size(), _vertices->ptr(), _dynamic ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW);
			glVertexAttribPointer(pos_loc, 3, GL_FLOAT, GL_FALSE, 0, (GLvoid*)0);
			glEnableVertexAttribArray(pos_loc);
			_vertices_byte_size = _vertices->bytes_size();
			_vertices_count = _vertices->size() / 3;
			checkGLError();
		}
		else {
			// method 1:
			//glBindBuffer(GL_ARRAY_BUFFER, vbos[(int)MeshVboType::POSITION]);
			//glBufferData(GL_ARRAY_BUFFER, arr->bytes_size(), arr->ptr(), _dynamic ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW);
			//checkGLError();

			// method 2:
			// 参考:https://learnopengl-cn.github.io/04%20Advanced%20OpenGL/07%20Advanced%20Data/
			// 设置当前 VB O对象
			glBindBuffer(GL_ARRAY_BUFFER, vbos[(int)MeshVboType::POSITION]);
			// 获取当前 VBO 的只写指针
			void* ptr = glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);
			// 复制数据到内存
			memcpy(ptr, arr->ptr(), arr->bytes_size());
			// 记得告诉OpenGL我们不再需要这个指针了
			if (glUnmapBuffer(GL_ARRAY_BUFFER) != GL_TRUE) {
				std::cerr bytes_size());
			// 记得告诉OpenGL我们不再需要这个指针了
			if (glUnmapBuffer(GL_ARRAY_BUFFER) != GL_TRUE) {
				std::cerr             
关注
打赏
1664331872
查看更多评论
0.0484s