• 纹理过滤
  • 纹理采样
    • 最近点采样
    • 线性纹理采样
    • MIPMAP纹理

纹理过滤

纹理拉伸:重复拉伸和截取拉伸

用于指定纹理坐标超过(00.0,1.0)范围时所发生的行为,使用glTexParameterf函数指定,GL_TEXTURE_WRAP_S 定义 s 坐标超出范围[0.0, 1.0]的情况,GL_TEXTURE_WRAP_T 设定 t 坐标。

  • GL_REPEAT 重复纹理,超过1的部分其实只看它的小数部分,也就是说比如纹理坐标为2.4,那么相当于取样0.4处的纹理值。
  • GL_CLAMP_TO_EDGE 采样纹理边缘,不想要任何格式的重复,应该使用 GL_CLAMP_TO_EDGE,超过1的部分都当成1.
  • GL_MIRRORED_REPEAT 重复纹理和镜像,在重复的基础上呈现镜像效果。

在立方体纹理的例子上,修改一下vertices数组,增加一个变量i

float vertices[] = new float[] {// 顶点             颜色            纹理坐标//前面0, 0, 1,  1,1,1,0,  0.5f*i, 0.5f*i,1, 1, 1,  1,0,0,0,  1.0f*i, 0.0f*i,-1, 1, 1,  1,0,0,0,  0.0f*i, 0.0f*i,0, 0, 1,  1,1,1,0,  0.5f*i, 0.5f*i,-1, 1, 1,  1,0,0,0,  0.0f*i, 0.0f*i,-1,-1, 1,  1,0,0,0,  0.0f*i, 1.0f*i,0, 0, 1,  1,1,1,0,  0.5f*i, 0.5f*i,-1,-1, 1,  1,0,0,0,  0.0f*i, 1.0f*i,1,-1, 1,  1,0,0,0,  1.0f*i, 1.0f*i,0, 0, 1,  1,1,1,0,  0.5f*i, 0.5f*i,1,-1, 1,  1,0,0,0,  1.0f*i, 1.0f*i,1, 1, 1,  1,0,0,0,  1.0f*i, 0.0f*i,//后面0, 0,-1,  1,1,1,0,  0.5f*i, 0.5f*i,1, 1,-1,  1,0,0,0,  1.0f*i, 0.0f*i,1,-1,-1,  1,0,0,0,   0.0f*i, 0.0f*i,0, 0,-1,  1,1,1,0,  0.5f*i, 0.5f*i,1,-1,-1,  1,0,0,0,   0.0f*i, 0.0f*i,-1,-1,-1,  1,0,0,0,  0.0f*i, 1.0f*i,0, 0,-1,  1,1,1,0,  0.5f*i, 0.5f*i,-1,-1,-1,  1,0,0,0,  0.0f*i, 1.0f*i,-1, 1,-1,  1,0,0,0, 1.0f*i, 1.0f*i,0, 0,-1,  1,1,1,0,  0.5f*i, 0.5f*i,-1, 1,-1,  1,0,0,0, 1.0f*i, 1.0f*i,1, 1,-1,  1,0,0,0,  1.0f*i, 0.0f*i,//左面-1, 0, 0,  1,1,1,0, 0.5f*i, 0.5f*i,-1, 1, 1,  1,0,0,0, 1.0f*i, 0.0f*i,-1, 1,-1,  1,0,0,0,  0.0f*i, 0.0f*i,-1, 0, 0,  1,1,1,0, 0.5f*i, 0.5f*i,-1, 1,-1,  1,0,0,0,  0.0f*i, 0.0f*i,-1,-1,-1,  1,0,0,0,  0.0f*i, 1.0f*i,-1, 0, 0,  1,1,1,0, 0.5f*i, 0.5f*i,-1,-1,-1,  1,0,0,0,  0.0f*i, 1.0f*i,-1,-1, 1,  1,0,0,0, 1.0f*i, 1.0f*i,-1, 0, 0,  1,1,1,0, 0.5f*i, 0.5f*i,-1,-1, 1,  1,0,0,0, 1.0f*i, 1.0f*i,-1, 1, 1,  1,0,0,0, 1.0f*i, 0.0f*i,//右面1, 0, 0,  1,1,1,0, 0.5f*i, 0.5f*i,1, 1, 1,  1,0,0,0, 1.0f*i, 0.0f*i*i,1,-1, 1,  1,0,0,0,  0.0f*i, 0.0f*i,1, 0, 0,  1,1,1,0, 0.5f*i, 0.5f*i,1,-1, 1,  1,0,0,0,  0.0f*i, 0.0f*i,1,-1,-1,  1,0,0,0,  0.0f*i, 1.0f*i,1, 0, 0,  1,1,1,0, 0.5f*i, 0.5f*i,1,-1,-1,  1,0,0,0,  0.0f*i, 1.0f*i,1, 1,-1,  1,0,0,0, 1.0f*i, 1.0f*i,1, 0, 0,  1,1,1,0, 0.5f*i, 0.5f*i,1, 1,-1,  1,0,0,0, 1.0f*i, 1.0f*i,1, 1, 1,  1,0,0,0, 1.0f*i, 0.0f*i,//上面0, 1, 0,  1,1,1,0,  0.5f*i, 0.5f*i,1, 1, 1,  1,0,0,0,  1.0f*i, 0.0f*i,1, 1,-1,  1,0,0,0,   0.0f*i, 0.0f*i,0, 1, 0,  1,1,1,0,  0.5f*i, 0.5f*i,1, 1,-1,  1,0,0,0,   0.0f*i, 0.0f*i,-1, 1,-1,  1,0,0,0,  0.0f*i, 1.0f*i,0, 1, 0,  1,1,1,0,  0.5f*i, 0.5f*i,-1, 1,-1,  1,0,0,0,  0.0f*i, 1.0f*i,-1, 1, 1,  1,0,0,0, 1.0f*i, 1.0f*i,0, 1, 0,  1,1,1,0,  0.5f*i, 0.5f*i,-1, 1, 1,  1,0,0,0, 1.0f*i, 1.0f*i,1, 1, 1,  1,0,0,0,  1.0f*i, 0.0f*i,//下面0,-1, 0,  1,1,1,0,  0.5f*i, 0.5f*i,1,-1, 1,  1,0,0,0,  1.0f*i, 0.0f*i,-1,-1, 1,  1,0,0,0,  0.0f*i, 0.0f*i,0,-1, 0,  1,1,1,0,  0.5f*i, 0.5f*i,-1,-1, 1,  1,0,0,0,  0.0f*i, 0.0f*i,-1,-1,-1,  1,0,0,0,  0.0f*i, 1.0f*i,0,-1, 0,  1,1,1,0,  0.5f*i, 0.5f*i,-1,-1,-1,  1,0,0,0,  0.0f*i, 1.0f*i,1,-1,-1,  1,0,0,0,  1.0f*i, 1.0f*i,0,-1, 0,  1,1,1,0,  0.5f*i, 0.5f*i,1,-1,-1,  1,0,0,0,  1.0f*i, 1.0f*i,1,-1, 1,  1,0,0,0,  1.0f*i, 0.0f*i};

设置i=2时,相当于纹理坐标设置的范围为(0,2)之间,定义纹理过滤方式为重复模式

GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S,GLES20.GL_REPEAT);
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T,GLES20.GL_REPEAT);


效果图

设置纹理过滤模式为重复镜像模式

GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,GLES20.GL_TEXTURE_WRAP_S,GLES20.GL_MIRRORED_REPEAT);
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,GLES20.GL_TEXTURE_WRAP_T,GLES20.GL_MIRRORED_REPEAT);

效果图

纹理采样

纹理采样就是根据偏远的纹理坐标到纹理图中提取对应位置颜色的过程,但一般而言,片元数量和纹理图中的像素数量并不一定相同,比如将较小的纹理图映射到较大的图元或者将较大的纹理图映射到较小的图元时就会出现这样的状况,通过纹理坐标在纹理图中并不一定能找到与之完全对应的像素,这时候就要采取相应的策略在纹理图中选取颜色了。

最近点采样

最近点采样的原理就是根据片元的纹理坐标在纹理图中的位置距离那个像素近就选择哪个像素的颜色值作为该片元的颜色采样值。最近点采样计算很简单,但存在的问题就是将较小的纹理图映射到较大的图元上容易产生明显的锯齿,同时将较大的纹理缩小的一定的程度后也就不好用了。加载纹理时设置最近点采样的方式

GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER,GLES20.GL_NEAREST);
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,GLES20.GL_TEXTURE_MAG_FILTER,GLES20.GL_NEAREST);

线性纹理采样

线性纹理采样的结果并不仅来自纹理图中的一个像素,在进行纹理采样时会考虑到该片元对应的纹理坐标周围的几个像素,然后根据周围几个像素的比例进行加权得到最终的采样结果。由于线性采样对多个像素进行了加权平均,仅此将较小的图元纹理映射到较大的图元时,不会有锯齿现象,而是平滑过渡。加载纹理时设置线性纹理采样的方式

GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER,GLES20.GL_LINEAR);
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,GLES20.GL_TEXTURE_MAG_FILTER,GLES20.GL_LINEAR);

因此一般来说对于缩小映射采用最近点采样,对于放大映射来说采用线性采样。GL_TEXTURE_MIN_FILTER表示缩小的映射,GL_TEXTURE_MAG_FILTER表示放大映射。

MIPMAP纹理

尽管用线性采样很适合处理放大的情况,但是对于缩小到一定的大小后,它就不好用了,一个纹理在渲染表面所占的大小减少的越多,就会有越多的纹理元素拥挤到一个片元上,一般情况下使用线性采样,每个片元值使用了四个纹理像素,我们就会失去很多的细节。

使用MIPMAP技术,可以用来生成一组优化过的不同大小的纹理,并且会使用所有的纹理元素来生成每个级别的纹理。当加载纹理的时候,不单单是加载一个纹理,而是加载一系列从大到小的纹理当mipmapped纹理状态中。在渲染时,OpenGL会根据每个片元的纹理元素数量为每个片元选择最合适的级别的纹理。

使用glGenerateMipmap函数自动生成多级纹理,对绑定的纹理调用glGenerateMipmap函数会产生从原始图像开始的多级纹理链。后续的每个纹理是上一个纹理图像的一半,一直持续到最后底部的1x1的纹理。

public static native void glGenerateMipmap(int target  );

加载MIP纹理的方式允许在设置纹理采样方式时采用MIP方式,即param参数除了GL_NEAREST和GL_LINEAR以外,还可以使用GL_NEAREST_MIPMAP_NEAREST、GL_NEAREST_MIPMAP_LINEAR、GL_LINEAR_MIPMAP_NEAREST、GL_LINEAR_MIPMAP_LINEAR。

public static native void glTexParameterf(int target,int pname,float param);

使用GL_LINEAR_MIPMAP_LINEAR模式效果最佳。
测试各种类型的纹理采样方式

代码下载

转载于:https://www.cnblogs.com/qhyuan1992/p/6071965.html

OpenGL ES 纹理设置相关推荐

  1. OpenGL ES 纹理

    纹理概念 纹理对象和纹理加载 应用纹理的例子 使用前面学过的技术已经可以利用OpenGL ES构建立体图形,并通过顶点着色器和片元着色器对其进行各种变化呢和光照等效果使得三维效果更加真实,实际上我看看 ...

  2. android opengl es 纹理 不同设备 白色,android – OpenGL ES 2.0纹理没有在某些设备上显示...

    早上好,这是2个纹理非幂的典型例子. 由于多种原因,纹理在分辨率上需要2的幂,这是一个非常常见的错误,每个人都碰巧陷入这个陷阱:)我也是. 2个纹理的非功率在某些设备/ GPU上运行平稳的事实,仅仅取 ...

  3. opengl es纹理贴图效果实例

    一.先准备好一张用来贴图的照片 二.纹理效果代码: gl.glEnable(GL10.GL_TEXTURE_2D);// 创建纹理gl.glGenTextures(1, textureids, 0); ...

  4. 一文详解 OpenGL ES 纹理颜色混合

    在OpenGL中绘制的时候,有时候想使新画的颜色和已经有的颜色按照一定的方式进行混合.例如:想使物体拥有半透明的效果,或者绘制叠加光亮的效果,这时候就需要用到OpenGLES混合. 如上图所示,为石头 ...

  5. Android Studio OpenGL ES绘制三棱锥/四面体的多纹理贴图 每个面使用一张图片渲染

    本文参考了王刚的<疯狂Android讲义(第3版)>P554-P559 要求:利用OpenGL ES绘制一个三棱锥,并对每个面进行纹理贴图,每个面使用不同的图片进行渲染. 环境:Andro ...

  6. OpenGL ES着色器语言之变量和数据类型

    所有变量和函数在使用前必须声明.变量和函数名是标识符. 没有默认类型,所有变量和函数声明必须包含一个声明类型以及可选的修饰符.变量在声明的时候首先要标明类型,后边可以跟多个变量,之间用逗号隔开.很多情 ...

  7. OpenGL ES 2.0 总体概述

    文章目录 OpenGL ES 2.0 总体概述 1. OpenGL ES 的两个小伙伴 1.1 EGL 1.2 GLSL 2. 屏幕图片的本质和产生过程 3. OpenGL ES pipeline 3 ...

  8. OpenGL ES 名词解释(二)

    目录 一.前言 二.坐标系 1.屏幕坐标系 2.纹理坐标系 3.顶点坐标系 4.图像坐标系 三.混合 四.变换矩阵 1.平移 2.旋转 3.缩放 4.矩阵组合顺序 五.投影矩阵 1.正交投影 2.透视 ...

  9. OpenGL ES: (5) OpenGL的基本概念、OpenGL ES 在屏幕产生图片的过程、OpenGL管线(pipeline)...

    一. OpenGL的基本概念 OpenGL 的结构可以从逻辑上划分为下面 3 个部分: 图元(Primitives) 缓冲区(Buffers) 光栅化(Rasterize) 图元(Primitives ...

最新文章

  1. 【MediaPipe】(2) AI视觉,人体姿态关键点实时跟踪,附python完整代码
  2. UTL_FILE包用法小记
  3. linux shell 判断文件是否存在
  4. 申请域名的理由_申请网站名称和域名注册为商标的重要性增加了吗?原因?
  5. 786. 第 K 个最小的素数分数
  6. php使用hset报错,hSet 命令/方法/函数
  7. 禁止root用户远程登录或者禁止其他用户登录而不删除它
  8. 修改时间日期 linux,查看和修改 Linux 的时间和日期
  9. Python数据结构与算法笔记(一):时间复杂度与空间复杂度
  10. python和java哪个好学-学Python 好还是java 好?
  11. 八、K8s 密码管理
  12. 卓有成效的程序员读书笔记
  13. InnoDB存储引擎MVCC的工作原理
  14. 【翻译】LearnYouSomeErlangForGreatGood(一):导言
  15. 配置全局less变量;解决iphoneX、 iphone8 plus 键盘退下去仍占空间,导致无法点击;vue-photo-preview 配置正常,但无法触发图片的预览
  16. 【大白话学习】UniApp 微信小程序与APP应用 开发零基础入门教程(一)---基础页面框架搭建
  17. 咸鱼Maya笔记—Maya 循环边
  18. 【天光学术】音乐教育论文:钢琴演奏触键在不同音乐时期的特征分析(节选)
  19. python色卡_python plt 色卡
  20. 路由器的主要技术指标

热门文章

  1. [机器学习笔记] Note1--机器学习简介
  2. tc溜溜865手机投屏卡_溜溜tcgames老版本(电脑玩手机游戏)-溜溜TC Games32位/64位旧版本PC下载V2.0.0官网安卓真机投屏-西西软件下载...
  3. Java list接口
  4. 系统架构设计师-软件水平考试(高级)-理论-操作系统
  5. CentOS6.9下ssh密钥登录配置步骤(免密码登录)和ssh-keygen 命令常用参数
  6. 普通树与二叉树的相互转化及哈夫曼树的了解
  7. 使用邮箱注册帐户以及激活
  8. 解析stm32的时钟
  9. 赵雅智:service_startService生命周期
  10. CAEmitterLayer 和 CAEmitterCell 粒子发射