opengl渲染4k数据提高效率
Posted qianbo_insist
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opengl渲染4k数据提高效率相关的知识,希望对你有一定的参考价值。
1、使用服务端vbo
顶点缓存对象提供顶点数组与显示列表的优势来提升OpenGL效率
1.1 VBO三个重要函数
创建VBO3个步骤:
1 使用glGenBuffers()生成新缓存对象。
2 使用glBindBuffer()绑定缓存对象。
3 使用glBufferData()将顶点数据拷贝到缓存对象中
glGenBuffers()
glGenBuffers()创建缓存对象并且返回缓存对象的标示符。2个参数:第一个为需要创建的缓存数量,第二个为用于存储ID地址。
void glGenBuffers(GLsizei n, GLuint* buffers)
glBindBuffer()
当缓存对象创建之后,在使用缓存对象之前,我们需要将缓存对象连接到相应的缓存上。glBindBuffer()2个参数:target与buffer。
void glBindBuffer(GLenum target, GLuint buffer)
target告诉VBO该缓存对象将保存顶点数组数据还是索引数组数据:GL_ARRAY_BUFFER或GL_ELEMENT_ARRAY。任何顶点属性,如顶点坐标、纹理坐标、法线与颜色分量数组都使用GL_ARRAY_BUFFER。用于glDraw[Range]Elements()的索引数据需要使用GL_ELEMENT_ARRAY绑定。注意,target标志帮助VBO确定缓存对象最有效的位置,如有些系统将索引保存AGP或系统内存中,将顶点保存在显卡内存中。
第一次调用glBindBuffer,VBO用0大小的内存缓存初始化该缓存,并且设置VBO的初始状态,如用途与访问属性。
glBufferData()
当缓存初始化之后,你可以使用glBufferData()将数据拷贝到缓存对象。
void glBufferData(GLenum target,GLsizeiptr size, const GLvoid* data, GLenum usage);
2、实际步骤
2.1创建像素缓冲器对象:
glGenBuffers(1, &pbo_id);
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pbo_id);
//分配4k 数据 3840x2160x4(宽度×高度×RGBA)到PBO:
glBufferData(GL_PIXEL_UNPACK_BUFFER, size, NULL, GL_STREAM_DRAW);
//使用映射map API 让PBO进入客户端的内存空间:
GLubyte *ptr = (GLubyte *)glMapBufferRange(
GL_PIXEL_UNPACK_BUFFER,
0,
size,
GL_MAP_WRITE_BIT | GL_MAP_FLUSH_EXPLICIT_BIT | GL_MAP_UNSYNCHRONIZED_BIT);
解码直接进入该存储器并且手动冲洗:
glFlushMappedBufferRange(GL_PIXEL_UNPACK_BUFFER, 0, size);
基本能够以每秒300帧执行此此类操作。
2.2 创建纹理:
glGenTextures(1, &texture_id);
glBindTexture(GL_TEXTURE_2D, texture_id);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, 0);
性能会降低很多,使用glTexSubImage2D可能在有些显卡上会造成渲染切换白屏问题,这个以后解决
渲染:
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
最后一步实际渲染时会大幅拉低性能。原因:数据量很大
因此如何做呢?
使用yuv数据渲染
使用yuv会大幅降低数据量,同时增加cpu和显卡调度数据的量,但是数量越大,yuv渲染的有时越高,注意小分辨率使用yuv没有意义。在4k这种分辨率上优势一下明显起来,后期我会写一个单独的qt 的播放器来测试yuv和离屏渲染,作为工具,希望大家关注,一起作为探讨的工具。
使用离屏渲染
使用多线程离屏渲染,这个需要实际测试,多路数据是否能提高效率。希望大家共同探讨,留下您的联系方式。
以上是关于opengl渲染4k数据提高效率的主要内容,如果未能解决你的问题,请参考以下文章