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数据提高效率的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL,交错的 VBO(顶点、法线和颜色)与光

由于OpenGL可以执行内置的背面剔除,因此它必须计算顶点法线;可以访问这些而不是将其作为属性发送吗?

计算与加载 OpenGL 的法线

OpenGL VBO 法线/光照问题

OpenGL 计算法线(四边形)

OpenGL,尽管逆时针顺序,一些法线反转