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(纹理优化)