opengl GPU 纹理加速优化

Posted qianbo_insist

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opengl GPU 纹理加速优化相关的知识,希望对你有一定的参考价值。

1、使用线性拉伸

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

GL_TEXTURE_MAG_FILTER 和 GL_TEXTURE_MIN_FILTER分别为放大和缩小时使用的过滤算法,如果使用GL_NEAREST,速度会更快一些,使用LINEAR会使用四个像素均值来计算像素点,因此画面会更平滑,但是会稍暗,不加分辨看不出来。
如下左图为GL_LINEAR,显然平滑度比较高

2、使用Mipmap

首先产生纹理后必须要告诉GPU进行层次化纹理生成
glGenerateMipmap(GL_Texture_2D);

使用mipmaps也很简单,设置过滤参数为以下4种中的任意一种:
GL_NEAREST_MIPMAP_NEAREST:   最邻近的mip层,并使用最邻近过滤。
GL_NEAREST_MIPMAP_LINEAR:    对两个mip层使用最邻近过滤后的采样结果进行加权平均。
GL_LINEAR_MIPMAP_NEAREST:    选择最邻近的mip层,使用线性插值算法进行过滤。
GL_LINEAR_MIPMAP_LINEAR:     对两个mip层使用线性插值过滤后的采样结果进行加权平均,又称三线性mipmap。

在实际不断地变化movie纹理产生的情况下,三线性纹理不可取,会使得亮度降低。
使用硬件 产生层次纹理

glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);

对于是动态的变化纹理和经常拉伸的图像来说,可以使用Mipmap,最好的方式为:

GL_LINEAR_MIPMAP_NEAREST

有人可能会问为什么不是GL_LINEAR_MIPMAP_LINEAR,这里给出原因,
1 、GL_LINEAR已经对图像进行了线性加权平均,在选择层次的时候NEAREST时最快的,而且图像不会发暗太多。兼顾了效率和效果,但是在高分辨率图像显示时,没有必要使用GL_LINEAR,反而是GL_NEARST 更为实际,因为GL_NEARST 速度更快,这时几乎没有损失,所以参数都是要灵活选择的。
2、 动态图像播放使用GL_LINEAR_MIPMAP_LINEAR是不合适的,会产生图像上的错误和滞留。

3、层级指定

指定需要加载0到4层级的纹理:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 4);
另外,GL_TEXTURE_MIN_LOD和GL_TEXTURE_MAX_LOD 可以来限制纹理的使用范围。

以上是关于opengl GPU 纹理加速优化的主要内容,如果未能解决你的问题,请参考以下文章

OPENGL ES 2.0 知识串讲 (10) ——OPENGL ES 详解IV(纹理优化)

OPENGL ES 2.0 知识串讲 (10) ——OPENGL ES 详解IV(纹理优化)

片段着色器中未使用纹理数据 - OpenGL

OpenGL、GLSL 片段着色器无法读取 Sampler2D 纹理

OpenGL ES 压缩纹理

纹理中的 OpenGL 片段着色器