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,一经查实,立即删除!

相关文章

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

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

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

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

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

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

dashboard windows 前端开发环境搭建

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

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

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

跨域问题及CORS机制

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

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

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

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

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

threejs- z-fighting 问题

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

bower overrides 配置

bower 是一个常用的包管理工具,用起来和npm很相似,但是两者又有一些区别,可以参考 —— What is the difference between Bower and npm。这里不说bower本身,而想说一下bower的overrides配置。 何谓override override 本身是覆盖…

windows下搭建Vagrant+Virtualbox环境

对于开发人员来说,Vagrant就是一个提供标准化开发环境的工具。通过Vagrant: 使每个开发人员电脑上的代码运行环境一致,再也不会出现“在我电脑上运行起来明明没有问题的”这样的开发环境不一致的问题。你可以使用Vagrant在windows下提供linu…

Jenkins主从节点配置

jenkins支持主从模式,这将会把构建任务分发到多个从节点去执行,这样就可以支撑起多个项目的大量构建任务,同时,你可以提供多种环境(如:开发环境、生产环境)来对同一个项目进行测试和构建。想要进…

HTML5 响应式图片

现在上网设备越来越多,各种设备的屏幕千差万别,如果只用一张图片去涵盖所有的设备,一是可能会造成某些设备上显示效果不佳,比如使用了一张低清晰度的图,而网页运行在一个高清大屏里;二是可能会浪费带宽&…

threejs坐标转换

屏幕坐标转three.js坐标 将屏幕坐标转变成threejs空间坐标: function transToThreeCoord(x,y){let mouse new THREE.Vector3();mouse.x (x/window.innerWidth)*2 -1;mouse.y -(y/window.innerHeight)*2 1;return mouse; }注意:在实际使用中&#x…

android socket 发送byte_如何正确地创建和销毁网络通讯程序中的Socket类的对象实例...

软件项目实训及课程设计指导——如何正确地创建和销毁软件应用系统中网络通讯中的Socket类的对象实例1、基于TCP/IP协议的Socket通信相关的基础知识(1)TCP/IP(Transmission Control Protocol传输控制协议/Internet Protocol网间协议)TCP/IP是目前Internet网络中的主要协议&…

H5 使用微信开放标签跳转小程序

微信开放标签是微信公众平台面向网页开发者提供的扩展标签集合,可以在网页上提供跳转小程序、打开 App 等能力。本文梳理使用微信开放标签跳转小程序的过程,以备日后查阅。 参考链接 1. 开放标签说明文档 准备已认证的服务号 开放标签只能绑定已认证…

【网络流24题】No.7 试题库问题 (最大流,二分图多重匹配)

【题意】 假设一个试题库中有 n 道试题。 每道试题都标明了所属类别。 同一道题可能有多个类别属性。现要从题库中抽取 m 道题组成试卷。并要求试卷包含指定类型的试题。 试设计一个满足要求的组卷算法。 输入文件示例input.txt3 153 3 42 1 21 31 31 31 33 1 2 32 2 32 1 31 2…

参数等效模型可以用于_干货分享电池单体产热特性及热模型标定分析(2)

上篇已讲解了电池单体产热特性及电池模型相关理论,相较之下等效电路模型无需对电池内部的电化学反应有着深入的分析,是通过电路来描述电池的开路电压、内阻等,以实现对电池外特性的表征。本篇将继续讨论此问题,用Matlab和Amesim模…

检测同心圆_(二)光线如何被眼睛检测到?

在第一篇文章中(链接:(一)视觉系统的全貌),我们已经了解了视觉信息被大脑处理的全过程。现在,我们把目光投向一切的起点——眼睛。实际上,人们提起“视觉”,首先想到的几…

matlab计算斜方差_计算一幅图像的信噪比

本文摘自本人的毕业设计《数字图像滤波算法研究》2019, Chang’an University, Xi’an, China.本文适用于原始图像(即不含噪声的图像)存在的情况下。使用待计算SNR图像(记为A)与原始图像(记为B)做相减运算&…