1.理解纹理

OpenGL中的纹理能够用来表示图像。照片,甚至由一个数学算法生成的分形数据。每一个二维的纹理都由很多小的纹理元素组成。它们是小块的数据,类似于我们前面讨论过的片段和像素。要使用纹理,最经常使用的方式是直接从一个图像文件载入数据。

每一个二维纹理都有其自己的坐标空间,其范围是从一个拐角的(0,0)到还有一个拐角的(1。1)。依照惯例,一个维度叫做S,而还有一个称为T。当我们想要把一个纹理应用于一个三角形或一组三角形的时候。我们要为每一个顶点指定一组ST纹理坐标,以便OpenGL知道须要用那个纹理的哪个部分画到每一个三角形上。

这些纹理坐标有时也会被称为UV纹理坐标。如图:

图1  OpenGL二维纹理坐标

对一个OpenGL纹理来说,它没有内在的方向性,因此我们能够使用不同的坐标把它定向到不论什么我们喜欢的方向上。

然而,大多数计算机图像都有一个默认的方向。它们通常被规定为Y轴向下,Y的值随着向图像的底部移动而添加。仅仅要我们记住,假设想用正确的方向观察图像,那纹理坐标就必需要考虑这点。这就不会给我们带来不论什么麻烦。

在标准OpenGL ES 2.0中。纹理不必是正方形,可是每一个维度都应该是2的幂(POT)。

这就意味着每一个维度都是这种一个数字,如128,256,512等。这样规定的原因在于非POT纹理能够被使用的场合很有限,而POT纹理使用于各种情况。

纹理的尺寸也有一个最大值,它依据不同的实现而变化。可是通常都比較大,比方2048*2048。

2.理解纹理过滤

当纹理的大小被扩大或者缩小时,我们还须要使用纹理过滤明白说明会发生什么。当我们在渲染表面上绘制一个纹理时,那个纹理的纹理元素可能无法精确地映射到OpenGL生成的片段上。

有两种情况:缩小和放大。

当我们尽力把几个纹理元素挤进一个片段时,缩小就发生了;当我们把一个纹理元素扩展到很多片段时。方法就发生了。针对每一种情况,我们能够配置OpenGL使用一个纹理过滤器。

首先。讲述两个主要的过滤模式:近期邻过滤和双线性插值。还有其它的过滤模式,以后的博文会解说。我们会使用以下的图像阐述每一种过滤模式。

近期邻过滤

这个方式为每一个片段选择近期的纹理元素。当我们放大纹理时,它的锯齿效果看起来相当明显,例如以下图所看到的。

每一个纹理单元都清楚的显示为一个小方块。

当我们缩小纹理时。由于没有足够的片段用来绘制全部的纹理单元,很多细节将会丢失。

双线性过滤


双线性过滤使用双线性插值平滑像素之间的过渡。而不是为每一个片段使用近期的纹理元素。OpenGL会使用四个邻接的纹理元素。并在它们之间用一个线性插值算法做插值,这个算法与前面所讲的平滑坐在着色一样。我们之所以称它为双线性插值。是由于它是沿着两个维度插值的。以下是使用双线性差值放大后的图像。它採用的纹理与前面的同样。

这个纹理如今看起来比曾经平滑多了。

但还是有些锯齿显现出来,由于我们把这个纹理扩展得太多。可是锯齿不像使用近期邻过滤那么明显。

MIP贴图



虽然双线性过滤非常适合处理放大,可是对于缩小到超过一定的大小时,它就不好用了。一个纹理在渲染表面所占大小降低得越多。就会有越多的纹理元素拥挤到每个片段上。

由于OpenGL的双线性过滤仅仅给每个片段使用四个纹理元素。我们将会丢失非常多细节。

由于每一帧都要选择不同的纹理元素。这还会引起噪音以及移动中的物体闪烁。

为了克服这些缺陷。能够使用MIP贴图技术,它能够用来生成一组优化过的不同大小的纹理。当生成这组纹理的时候,OpenGL会使用全部的纹理元素生成每一个级别的纹理,当过滤纹理时,还要确保全部的纹理元素都能被使用。在渲染时,OpenGL会依据每一个片段的纹理元素数量为每一个片段选择最合适的级别。

下图是一组MIP贴图的纹理,把它们合并在一当个图上是为了方便对照。

图2 MIP贴图的纹理

使用MIP贴图。会占用很多其它的内存,可是渲染也会更快,这是由于较小级别的纹理在GPU的纹理缓存中占用较少的空间。

为了更好地理解MIP贴图是怎样提高缩小情况下的质量,我们比較一下那个可爱的机器人。使用双线性过滤把纹理元素尺寸缩小到其原来的12.5%。例如以下图:

图3 使用双线性过滤缩小

就这样的质量,可能还不如近期邻过滤。看一下当我们增加MIP贴图时会得到什么。例如以下图:

图4 使用MIP贴图缩小

随着MIP贴图的使用。OpenGL将选择最合适的纹理级别。然后用优化过的纹理做双线性插值。每一个级别的纹理都是用来自全部纹理元素的信息构建的。因此得到的图形看起来更好些。保留了很多其它的细节。

三线性过滤

假设OpenGL在不同的MIP贴图级别之间来回切换,当我们用双线性插值来使用MIP贴图时。在其渲染的场景中,在不同级别的MIP贴图切换时。我们有时候能看到明显的跳跃或者线条。我们能够切换到三线性插值。这样。每一个片段总共要使用8个纹理元素插值。

这有助于消除每一个MIP贴图级别之间的过渡,而且得到一个更平滑的图像。

3.程序中纹理參数表

方法GLES20.glTextParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAX_FILTER。“纹理过滤模式”)。第二个參数指放大的情况。

方法GLES20.glTextParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,“纹理过滤模式”);第二个參数指缩小的情况。

第一个參数是告诉OpenGL这应该被作为一个二维纹理对待。

表1  OpenGL纹理过滤模式

GL_NEAREST

近期邻过滤

                        GL_NEAREST_MIPMAP_NEAREST

使用MIP贴图的近期邻过滤

        GL_NEAREST_MIPMAP_LINEAR

使用MIP贴图级别之间插值的近期邻过滤

GL_LINEAR

双线性插值

GL_LINEAR_MIPMAP_NEAREST

使用MIP贴图的双线性插值

GL_LINEAR_MIPMAP_LINEAR

三线性插值(使用MIP贴图级别之间插值的双线性过滤)

表2  每种情况同意的纹理过滤模式

缩小 GL_NEAREST
GL_NEAREST_MIPMAP_NEAREST
GL_NEAREST_MIPMAP_LINEAR
GL_LINEAR
GL_LINEAR_MIPMAP_NEAREST
GL_LINEAR_MIPMAP_LINEAR
放大 GL_NEAREST
GL_LINEAR

下一篇纹理的应用效果图例如以下:

Android OpenGL ES(七)----理解纹理与纹理过滤相关推荐

  1. opengl es java_java – 在Android OpenGL ES App中加载纹理

    1)您应该根据需要分配尽可能多的纹理名称.一个用于您正在使用的每个纹理. 加载纹理是一项非常繁重的操作,会使渲染管道停顿.所以,你永远不应该在游戏循环中加载纹理.您应该在呈现纹理的应用程序状态之前具有 ...

  2. Android OpenGL ES 学习(十一) –渲染YUV视频以及视频抖音特效

    OpenGL 学习教程 Android OpenGL ES 学习(一) – 基本概念 Android OpenGL ES 学习(二) – 图形渲染管线和GLSL Android OpenGL ES 学 ...

  3. Android OpenGL ES 学习(二) -- 图形渲染管线和GLSL

    OpenGL 学习教程 Android OpenGL ES 学习(一) – 基本概念 Android OpenGL ES 学习(二) – 图形渲染管线和GLSL Android OpenGL ES 学 ...

  4. Android OpenGL ES 学习(六) – 使用 VBO、VAO 和 EBO/IBO 优化程序

    OpenGL 学习教程 Android OpenGL ES 学习(一) – 基本概念 Android OpenGL ES 学习(二) – 图形渲染管线和GLSL Android OpenGL ES 学 ...

  5. Android OpenGl Es 学习(二):定义顶点和着色器

    概述 这是一个新的系列,学习OpengGl Es,其实是<OpenGl Es 应用开发实践指南 Android卷>的学习笔记,感兴趣的可以直接看这本书,当然这个会记录自己的理解,以下只作为 ...

  6. Android OpenGL ES 学习(十) – GLSurfaceView 源码解析GL线程以及自定义 EGL

    OpenGL 学习教程 Android OpenGL ES 学习(一) – 基本概念 Android OpenGL ES 学习(二) – 图形渲染管线和GLSL Android OpenGL ES 学 ...

  7. Android OpenGL ES 学习(九) – 坐标系统和实现3D效果

    OpenGL 学习教程 Android OpenGL ES 学习(一) – 基本概念 Android OpenGL ES 学习(二) – 图形渲染管线和GLSL Android OpenGL ES 学 ...

  8. Android OpenGL ES 学习(五) -- 渐变色

    OpenGL 学习教程 Android OpenGL ES 学习(一) – 基本概念 Android OpenGL ES 学习(二) – 图形渲染管线和GLSL Android OpenGL ES 学 ...

  9. Android OpenGL ES 学习(十二) - MediaCodec + OpenGL 解析H264视频+滤镜

    OpenGL 学习教程 Android OpenGL ES 学习(一) – 基本概念 Android OpenGL ES 学习(二) – 图形渲染管线和GLSL Android OpenGL ES 学 ...

  10. Android OpenGL ES视频渲染(一)GLSurfaceView

    相关文章:Android OpenGL ES视频渲染(二)EGL+OpenGL Android中视频渲染有几种方式,之前的文章使用的是nativewindow(包括softwareRender).今天 ...

最新文章

  1. putty秘钥验证登录和xshell秘钥验证登录
  2. Codeforces 859C - Pie Rules
  3. html中设置文本框长度,Html的文本框怎样限制录入文本框的字节长度
  4. SQL Server 索引重建或索引重組
  5. IDAE启动报错:Intellij idea Cannot start internal HTTP server. Git integration, JavaScript debugger...
  6. android菜单和对话栏,Android回顾--(十一) 菜单和对话框
  7. tms tck_两个用于Eclipse的TCK –开源到底有什么?
  8. 作者:何波(1989-),男,就职于中国信息通信研究院互联网法律研究中心
  9. 五大软件设计原则学习笔记4——接口隔离原则
  10. android+后台+拍照,Android相机无法从后台服务拍照
  11. 配色方案|平板羽毛集,为你的下个作品做安排
  12. python时间转绝对秒数_python时间时分秒与秒数的互相转换
  13. Android RoboGuice开源框架、Butter Knife开源框架浅析
  14. PCFG中inside和outside算法详解
  15. Stack Overflow 2017 开发者调查报告(程序员必看)
  16. VR:下一个技术风口
  17. ubuntu 18.04 安装teamview(包括正常的安装教程,以及一个纯终端教程)
  18. 暑期作息时间表模板_小学生暑假作息时间表模板范例
  19. cad打开服务器文件太慢,CAD打开文件很慢怎么处理
  20. f7功能键使用计算机,F1到F12都代表什么 电脑键盘上F1-F12键的用法

热门文章

  1. 【土豆】——做人,要像土豆一样
  2. pycaret 2 1新增功能
  3. 台式计算机怎么安装无线网卡,台式机装无线网卡,详细教您台式机怎么使用无线网卡上网...
  4. 漏洞挖掘分析技术总结
  5. Php把ts转为mp4,ts文件转换为mp4文件软件电脑版下载
  6. Vue----ele-admin1
  7. 学校机房计算机类型,学校计算机机房的管理和维护建议原稿(样例3)
  8. python用户画像_研究用户应该从哪几个维度去构建用户画像模型?
  9. Shawn,别让我们失望
  10. 使用Service Worker发送Push推送