OpenGL ES 纹理设置

  • 纹理过滤
  • 纹理采样
    • 最近点采样
    • 线性纹理采样
    • 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/429922.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安装kubernetes dashboard时开发环境,运行gulp local-up-cluster任务一直显示wating for a heapster

问题 按照官方教程搭建dashboard的开发环境,运行“gulp local-up-cluster”任务,一直不断显示“waiting for a heapster…”,日志如下: ... [16:37:22] Finished spawn-cluster after 670 ms ... [16:37:22] Finished wait-for-…

react做h5 例子_使用React写一个网站的心得体会

网站是毕业设计的作品,开发这个网站的目的主要用于记录一些笔记,以及聚合一些资讯信息,也算自己在网络世界中的一块静地吧,可以在这里一些技术上想法的实践。网站最初前端使用vue开发,在前段时间由于项目的开发进度已经…

linux命令小常识

作为一个tester我们必须要会linux,也许你会说不用也可以。那么我想问,你部署测试环境在哪里,你下载war包并部署war包呢,你看日志在哪里? 基于测试需要用到liunx,我这里只针对需要用到的,工作就是不断在探索中学习&…

ubuntu联网不稳定,时断时连问题的解决办法

概览 ubuntu联网不稳定,时断时连问题的解决办法现象网络一会儿连上,过一会又自动断开,再等一会儿又断了。问题原因可能是受ipv6的影响解决办法关闭掉ipv6 详细步骤 1、编辑连接,打开“ipv6 settings”,将method设置…

如何根据原理图画封装_常用原理图封装

原理图常用库文件:Miscellaneous Devices.ddbDallas Microprocessor.ddbIntel Databooks.ddbProtel DOS Schematic Libraries.ddbPCB元件常用库:Advpcb.ddbGeneral IC.ddbMiscellaneous.ddb分立元件库部分 分立元件库元件名称及中英对照AND 与门ANTENNA …

搭建GitLab+Jenkins持续集成环境图文教程

GitLab是一个代码仓库,用来管理代码。Jenkins是一个自动化服务器,可以运行各种自动化构建、测试或部署任务。所以这两者结合起来,就可以实现开发者提交代码到GitLab,Jenkins以一定频率自动运行测试、构建和部署的任务,…

随笔-1031

随笔1030 学习第四天 样式表的样式 一、大小宽度width高度height 二、背景1.background-color 背景色2.background-image 背景图片3.background-repeat:no-repeat 背景图的平铺方式4.background-position 背景图的位置 center等5.background-attachment 背景图是否滚…

exception日志 php_PHP 错误与异常的日志记录

提到 Nginx PHP 服务的错误日志,我们通常能想到的有 Nginx 的 access 日志、error 日志以及 PHP 的 error 日志。虽然看起来是个很简单的问题,但里面其实又牵扯到应用配置以及日志记录位置的问题,如果是在 ubuntu 等系统下使用 apt-get 的方…

threejs-经纬度转换成xyz坐标的方法

用threejs做3D应用时,很经常会接触到球状物体,比如说地球,要定义球上的一点,用经纬度是常用的办法。现在,我们要在北京这个地方标一个点,北京的坐标为——北纬39.9”,东经116. 3”,该…

两个tplink路由器有线桥接_TP-Link路由器如何设置有线方式桥接(两个或多个路由器串联上网)图文教程...

第一页:TP-Link路由器有线方式桥接设置图文教程第二页:TP-Link路由器有线方式桥接设置图文教程本文介绍了TP-Link路由器有线桥接的设置方法,路由器有线桥接其实严格上应该叫做:两个(多个)路由器串联上网。主要适用于这样的网络环境…

双内核问题

<meta http-equiv"Content-Type" content"text/html; charsetutf-8"><!--优先使用 IE 最新版本和 Chrome--><meta http-equiv"X-UA-Compatible" content"IEedge,chrome1"><!--360浏览器QQ,搜狗等双内核浏览器&am…

dashboard windows 前端开发环境搭建

dashboard是kubernetes的云管平台UI界面&#xff0c;正常情况下&#xff0c;其是在linux下开发的&#xff0c;但是&#xff0c;有些特殊情况下&#xff0c;我们也可能希望在windows上搭建起dashboard的开发环境 这里我们将搭建的开发环境的结构如下&#xff1a; windows上只运…

a pycharm 标记多个_每周分享五个 PyCharm 使用技巧(二)

这是 「PyCharm 技巧分享」系列的第二篇分享。由于上一篇文章得到了大家的一些赞同&#xff0c;所以今天又来给大家推荐一些我平时自己有用的小技巧&#xff0c;大家择需所取即可。先声明下&#xff0c;并不保证对所有的人都是有帮助的&#xff0c;所以请大神嘴下留情&#xff…

Visual Studio2012打开时弹出“遇到异常:这可能是由某个扩展导致的”错误的解决办法...

Visual Studio2012打开时弹出“遇到异常&#xff1a;这可能是由某个扩展导致的”错误的解决办法&#xff1a; 具体问题如下&#xff1a; 分析原因&#xff1a;网上搜集了以下&#xff0c;出现异常的原因是安装了第三方控件&#xff0c;然后删除是没有删除干净&#xff0c;导致日…

python url拼接_详解Python urlencode编码和url拼接方法

urlencode 调用方法urlencode的参数必须是Dictionaryimport urllibd {name1:www.pythontab.com,name2:bbs.pythontab.com}print urllib.urlencode(d)输出&#xff1a;name2bbs.pythontab.com&name1www.pythontab.com相当于拼接两个url参数&#xff0c;这个用法类似于PHP中…

跨域问题及CORS机制

跨域 跨域是指一个资源请求与其不在同一个域&#xff08;源&#xff09;的资源&#xff0c;不在同一个域&#xff08;源&#xff09;是指两个域的协议、域名或端口不同。 同源策略 出于安全考虑&#xff0c;浏览器制定了同源策略&#xff0c; 限制了某些跨域请求。同源策略是…

【LuoguP3038/[USACO11DEC]牧草种植Grass Planting】树链剖分+树状数组【树状数组的区间修改与区间查询】...

模拟题&#xff0c;可以用树链剖分线段树维护。 但是学了一个厉害的。。树状数组的区间修改与区间查询。。 分割线里面的是转载的&#xff1a; -------------------------------------------------------------------------------- [ 3 ] 上面都不是重点……重点是树状数组的区…

oracle .dbf文件过大_学习这篇Oracle数据库文件坏块损坏的恢复方法,拓展你的知识面...

一、Oracle数据库系统简介&#xff1a;ORACLE数据库系统是美国ORACLE公司&#xff08;甲骨文&#xff09;提供的以分布式数据库为核心的一组软件产品&#xff0c;是目前最流行的客户/服务器(CLIENT/SERVER)或B/S体系结构的数据库之一。比如SilverStream就是基于数据库的一种中间…

threejs- z-fighting 问题

Z-Buffer 在threejs中&#xff0c;使用深度缓冲&#xff08;Z-Buffer&#xff09;来完成场景可见性计算&#xff0c;即确定场景哪部分可见&#xff0c;哪部分不可见。深度缓冲&#xff08;Z-Buffer&#xff09;是一个二维数组&#xff0c;其中的每一个元素对应屏幕上的一个像素…

python2中文字符串遍历乱码_完美解决Python2操作中文名文件乱码的问题

Python2默认是不支持中文的&#xff0c;一般我们在程序的开头加上#-*-coding:utf-8-*-来解决这个问题&#xff0c;但是在我用open()方法打开文件时&#xff0c;中文名字却显示成了乱码。我先给大家说说Python中的编码问题&#xff0c;Python中的字符串的大概分为为str和Unicode…