Android OpenGL ES详解——纹理:纹理过滤GL_NEAREST和GL_LINEAR的区别

OpenGL中的纹理过滤GL_NEAREST和GL_LINEAR 当需要从纹理中采样颜色时,GL_LINEAR模式会考虑采样点周围最近的四个纹理像素(一个正方形区域内的像素),并对这四个像素的颜色值进行加权平均,以得到平滑过渡的颜色。当需要从纹理中采样颜色时,GL_NEAREST模式会选择离采样点最近的纹理像素(通常是最接近采样点的纹理元素的中心),并直接使用该像素的颜色值作为输出。这种模糊是由于插值过程混合了多个像素的颜色造成的。3、清晰度:对于小尺寸、像素艺术风格或需要保持锐利边缘的纹理,GL_NEAREST模式可以保留原始像素的精确颜色,保持图像的清晰度和细节。 阅读详情

目录

一、概念

1、纹理过滤

2、邻近过滤

3、线性过滤

二、邻近过滤和线性过滤的区别

三、源码下载


一、概念

1、纹理过滤

当纹理被应用到三维物体上时,随着物体表面的形状和相机视角的变化,会导致纹理在渲染过程中出现一些问题,如锯齿状边缘、失真、模糊等。

纹理过滤的作用是解决这些问题,以获得更好的渲染效果。其目的是在纹理被应用到三维模型上时,通过对纹理上的像素进行插值或采样,使得纹理在不同距离和角度下呈现出更平滑、更真实的外观。

纹理坐标不依赖于分辨率(Resolution),它可以是任意浮点值,所以OpenGL需要知道怎样将纹理像素(Texture Pixel,也叫Texel,译注1)映射到纹理坐标。当你有一个很大的物体但是纹理的分辨率很低的时候这就变得很重要了。你可能已经猜到了,OpenGL也有对于纹理过滤(Texture Filtering)的选项。纹理过滤有很多个选项,但是现在我们只讨论最重要的两种:GL_NEAREST和GL_LINEAR。(Texture Pixel也叫Texel,你可以想象你打开一张.jpg格式图片,不断放大你会发现它是由无数像素点组成的,这个点就是纹理像素;注意不要和纹理坐标搞混,纹理坐标是你给模型顶点设置的那个数组,OpenGL以这个顶点的纹理坐标数据去查找纹理图像上的像素,然后进行采样提取纹理像素的颜色。)

2、邻近过滤

GL_NEAREST(也叫邻近过滤,Nearest Neighbor Filtering)是OpenGL默认的纹理过滤方式。当设置为GL_NEAREST的时候,OpenGL会选择中心点最接近纹理坐标的那个像素。下图中你可以看到四个像素,加号代表纹理坐标。左上角那个纹理像素的中心距离纹理坐标最近,所以它会被选择为样本颜色:

  • 原理:OpenGL会选择中心点最接近纹理坐标的那个像素作为当前纹理坐标的像素。这种方式不进行任何插值计算,直接采用最邻近像素的颜色值。

  • 特点:

    • 快速:由于无需进行复杂的插值计算,GL_NEAREST在性能上通常更优。
    • 锯齿状边缘:由于直接使用单个像素的颜色,放大后的纹理会出现明显的锯齿边缘,尤其是在大幅度缩放或以低分辨率纹理渲染高分辨率物体时。
    • 清晰度:对于小尺寸、像素艺术风格或需要保持锐利边缘的纹理,GL_NEAREST可以保留原始像素的精确颜色,保持图像的清晰度和细节。

3、线性过滤

GL_LINEAR(也叫线性过滤,(Bi)linear Filtering)它会基于纹理坐标附近的纹理像素,计算出一个插值,近似出这些纹理像素之间的颜色。一个纹理像素的中心距离纹理坐标越近,那么这个纹理像素的颜色对最终的样本颜色的贡献越大。下图中你可以看到返回的颜色是邻近像素的混合色:

  • 原理:基于纹理坐标附近的纹理像素,计算出一个插值,以近似出这些纹理像素之间的颜色。具体来说,当设置为GL_LINEAR时,OpenGL会考虑采样点周围最近的四个纹理像素(一个正方形区域内的像素),并对这四个像素的颜色值进行加权平均,以得到平滑过渡的颜色。对于三维纹理或更高维度的纹理,它会考虑更多的相邻像素并进行更高维的线性插值。

  • 特点:

    • 平滑:GL_LINEAR产生的纹理放大效果更加平滑,边缘没有明显的锯齿,视觉效果更为柔和。
    • 模糊:相较于GL_NEAREST,GL_LINEAR可能会引入轻微的模糊,特别是在大幅度缩放时。这种模糊是由于插值过程混合了多个像素的颜色造成的。
    • 适用场景:对于需要平滑过渡、细节丰富、或对视觉质量要求较高的纹理(如照片、自然景观、高清图形等),GL_LINEAR通常能提供更好的视觉效果。

综上所述,GL_NEAREST和GL_LINEAR之所以产生不同的图案效果,是因为它们在处理纹理采样时采用了不同的方法和策略。GL_NEAREST直接采用最邻近像素的颜色值,因此会产生颗粒状图案;而GL_LINEAR则通过考虑附近多个像素的颜色值并进行加权平均,从而得到更平滑的图案效果。

二、邻近过滤和线性过滤的区别

那么这两种纹理过滤方式有怎样的视觉效果呢?让我们看看在一个很大的物体上应用一张低分辨率的纹理会发生什么吧(纹理被放大了,每个纹理像素都能看到):

GL_NEAREST产生了颗粒状的图案,我们能够清晰看到组成纹理的像素,而GL_LINEAR能够产生更平滑的图案,很难看出单个的纹理像素。GL_LINEAR可以产生更真实的输出,但有些开发者更喜欢8-bit风格,所以他们会用GL_NEAREST选项。

当进行放大(Magnify)和缩小(Minify)操作的时候可以设置纹理过滤的选项,比如你可以在纹理被缩小的时候使用邻近过滤,被放大时使用线性过滤。我们需要使用glTexParameter*函数为放大和缩小指定过滤方式。这段代码看起来会和纹理环绕方式的设置很相似:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

三、源码下载

Android OpenGL 图片Texture渲染render 演示demo下载:

https://download.youkuaiyun.com/download/github_27263697/89927774

推荐文章

https://learnopengl-cn.readthedocs.io/zh/latest/01%20Getting%20started/06%20Textures/

https://juejin.cn/post/7369620466397675570

OpenGL纹理贴图 OpenGL纹理1. 基本概念2. 纹理环绕方式3. 纹理过滤3.1 GL_NEAREST3.2 GL_LINEAR3.3 多级渐远纹理 (Mipmap)4. 纹理加载与创建4.1 纹理加载4.2 纹理创建4.3 纹理的使用 1. 基本概念 纹理是一个2D图片(甚至也有1D和3D的纹理),它可以用来表示物体的细节特征,希望绘制一个有足够多细节的物体,当然可以用足够多的顶点颜色来描述,但是无疑也增加了许多额外的开销;另一种办法就是使用纹理。 学习之前先展示一张实现的纹理图以更好理解纹理! 还是这张图为了将纹 阅读详情

相关推荐

OpenGL之纹理过滤(Texture Filtering)、MipMap方法、纹理坐标

图形编程技术

TxyITxs的博客 3318

渲染的本质: 纹理过滤(Texture filtering)技术

在计算机图形学中,纹理过滤或者说纹理平滑是在纹理采样中使采样结果更加合理,以减少各种人为产生的穿帮现象的技术。纹理过滤分为放大过滤和缩小过滤两种类型。对应于这两种类型,纹理过滤可以是通过对稀疏纹理插值进行填充的重构过滤(需要放大)或者是需要的纹理尺寸低于纹理本身的尺寸时(需要缩小)的一种抗锯齿过滤。简单来讲,纹理过滤就是用来描述在不同形状、大小、角度和缩放比的情况下如何应用纹理。根据使用的过滤算法...

dick_zhang的博客 2万+

【OpenGL】OpenGL入门之纹理(Texture)

目录   在此之前,我们已经可以为每个顶点添加颜色来增加图形的细节,从而创建出有趣的图像。但是,如果想让图形看起来更真实,我们就必须有足够多的顶点,从而指定足够多的颜色。这将会产生很多额外开销,因为每个模型都会需求更多的顶点,每个顶点又需求一个颜色属性。   由此我们使用纹理(Texture) 进行处理。纹理是一个2D图片(甚至也有1D和3D的纹理),它可以用来添加物体的细节。因为我们可以在一张图片上插入非常多的细节,这样就可以让物体非常精细而不用指定额外的顶点。 ...

YangMax1的博客 1万+

【Android开发学习19】关于GL_NEAREST和GL_LINEAR的选择

GL_NEAREST和GL_LINEAR 前者表示“使用纹理中坐标最接近的一个像素的颜色作为需要绘制的像素颜色”, 后者表示“使用纹理中坐标最接近的若干个颜色,通过加权平均算法得到需要绘制的像素颜色”。 前者只经过简单比较,需要运算较少,可能速度较快, 后者需要经过加权平均计算,其中涉及除法运算,可能速度较慢(但如果有专门的处理硬件,也可能两者速度相同)。 从视觉效果上看,前者效果较...

移动开发记录 489

关于纹理滤波方式

1、 为什么在纹理采样时需要texture filter       我们的纹理是要贴到三维图形表面的,而三维图形上的pixel中心和纹理上的texel中心并不一至(pixel不一定对应texture上的采样中心texel),大小也不一定一至。当纹理大于三维图形表面时,导至一个像素被映射到许多纹理像素上;当维理小于三维图形表面时,许多个象素都映射到同一纹理。 当这些情况发生时,贴图

mikewolf2009的专栏 1766

Unity3D用c#脚本调用前端javascript函数:H5获取unity - webgl 加载并初始化完成的消息

unity3d发布的Webgl 可以作为静态文件加载到H5页面中,并通过javascript 调用unity内置的C#脚本函数,详见Webgl调用unity api。而往往我们需要知道Webgl ready的消息,本文将给出unity 内部调用javascript函数的方案加以解决。

Bravo 2475

[OpenGL]从零开始写一个Android平台下的全景视频播放器——1.4 用OpenGL ES 2.0显示一张图片(下)

Github项目地址,欢迎star~!为了方便没有准备好梯子的同学,我把项目在优快云上打包下载,不过更新会慢一些回到目录今天早上突然想起来,其实矩形只要两个三角形就好了嘛。我非要用四个三角形画,肯定是中了三角形扇的毒。。创建一个纹理纹理的创建比较复杂,我们创建一个新的工具类,并且加入如下代码: public class TextureHelper { private static fi

Martin的博客 5201

Unity AR涂涂乐实战:用户上传图片秒变3D模型新皮肤(附完整代码)

本文详细介绍了如何在Unity AR应用中实现用户上传图片动态生成3D模型皮肤的功能,重点讲解了动态创建材质球的技术方案和性能优化策略。通过完整的代码示例,开发者可以学习到多源图片处理、移动端内存管理以及AR场景适配等核心技巧,快速打造高性能的儿童教育类AR应用。

weixin_31509753的博客 370

ExoPlayer GL demo 深度解析:用 GLSurfaceView + GL Shader 实现视频位图叠加渲染

本文围绕 ExoPlayer 仓库中的 `demos/gl` 示例应用展开,讲解如何将解码后的视频帧渲染到 `GLSurfaceView` 上,并通过 GL shader 对画面进行后处理。该 demo 在视频画面上叠加了一张由 Android Canvas 动态绘制的位图(包含应用图标与当前帧的展示时间戳),完整示范了"ExoPlayer 视频输出 → SurfaceTexture → GL 纹

gitblog_00075的博客 418

学术报告系列(二) - 智能自主作业机器人感知与控制技术及发展趋势

收集整理于2022年模式识别高峰论坛湖南大学王耀南院士报告(报名题目:智能自主作业机器人感知与控制技术及发展趋势)

Make something people want. 4696

告别混乱接线!用EPLAN 3D布局图,手把手教你搞定电气柜的3D建模与自动布线

本文详细介绍了如何使用EPLAN 3D布局图进行电气柜的3D建模与自动布线,帮助工程师告别混乱接线。从项目准备、基础结构建模到智能设备布局与逻辑定义,再到高级布线技术与问题排查,提供了一套完整的实战指南。通过EPLAN的3D功能,显著提升设计效率与系统可靠性。

weixin_30680385的博客 339

Android_OpenGLES2

源码位置:external/mesa3d/* OpenGLES1与OpenGLES2最大的差异是1.0使用固定渲染管线,2.0使用可编程渲染管线。 VBO,全名Vertex Buffer Object,顶点缓冲区对象。它是GPU里面的一块缓冲区,当我们需要传递数据的时候,可以先向GPU申请一块内存,然后往里面填充数据。最后,再通过调用 glVertexAttribPointer把数据传递给Ve...

hpp205的专栏 998

Cass三角网法土方计算优化技巧:如何根据地形特点调整边界采样间距

本文深入探讨了Cass软件中三角网法(DTM法)土方计算的优化技巧,核心在于如何根据地形的复杂程度动态调整边界采样间距。针对平坦、复杂及人工构造物等不同地形特征,提供了具体的间距调整策略与精度验证方法,旨在帮助工程师在计算精度与效率间找到最佳平衡,实现精细化土方计算。

weixin_29294975的博客 523

C++ opengl 纹理过滤之GL_NEAREST

源码还是这个博文里的 https://blog.youkuaiyun.com/qq78442761/article/details/81228557   GL_LINEAR过滤:表示给多边形进行着色的时候,它的颜色需要通过他周围的一些点进行某一种线性的差值之后计算出来的颜色; GL_NEAREST过滤:表示给多边形进行着色的时候,取离他当前最近的那个纹理坐标的颜色【纹理图片是离散的(如128*128...

IT1995的博客 5397

jetson agx orin开箱及接口介绍

jetson agx orin开箱及接口介绍

qq_58728069的博客 1万+

ARS408毫米波雷达数据解析避坑指南:从硬件连接到Python处理

本文提供了ARS408毫米波雷达从硬件连接到Python数据处理的完整实战指南。针对串口通信不稳定、数据解析错误等常见问题,详细解析了硬件连接方案选择、串口数据高效读取策略、二进制协议解析的位操作技巧,并给出了坐标转换、目标跟踪及实时可视化的代码实现,帮助开发者快速搭建稳定的雷达数据处理流水线。

weixin_29091105的博客 149

OpenGL学习(四)纹理

纹理一般采取映射的方法。 注意坐标从右下角开始 当纹理坐标超出默认范围时,每个选项都有不同的视觉效果输出。我们来看看这些纹理图像的例子: ...

HeroIsUseless的博客 832

实战分享:如何用Java调用Doris FE接口实现高效Stream Load数据导入(附完整代码)

本文详细介绍了如何通过Java调用Doris FE接口实现高效的Stream Load数据导入,包含完整代码示例和性能优化技巧。Stream Load作为Doris的高效数据导入方式,相比传统JDBC提升5-10倍速度,适用于大规模数据处理场景,帮助开发者解决高吞吐量数据导入挑战。

weixin_29304985的博客 417

OpenGL(十五)——Qt OpenGL三种不同的纹理滤波方式、光照、物体的移动

本篇分享 1、如何使用三种不同的纹理滤波方式。 2、如何使用键盘来移动场景中的对象, 3、如何在OpenGL场景中应用简单的光照。

ifeng12358的博客 4128

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

OpenGL学习笔记(十二)

目录纹理纹理环绕方式(Texture Wrapping)纹理过滤(Texture Filtering)多级渐远纹理(Mipmap) 纹理 我们已经了解到,我们可以为每个顶点添加颜色来增加图形的细节,从而创建出有趣的图像。但是,如果想让图形看起来更真实,我们就必须有足够多的顶点,从而指定足够多的颜色。这将会产生很多额外开销,因为每个模型都会需求更多的顶点,每个顶点又需求一个颜色属性。 所以引入纹理(Texture)的概念。纹理是一个2D图片(甚至也有1D和3D的纹理),它可以用来添加物体的细节;你可以想象纹理

u012043391的专栏 435

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

OpenGL:纹理

OpenGL:纹理

肖云鹤的博客 2967

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

openGL之纹理

opengl纹理相关介绍

lzz555517的博客 2398

OpenGL(QT平台)学习与实战(十一)

纹理过滤 纹理坐标不依赖于分辨率(Resolution),它可以是任意浮点值,所以OpenGL需要知道怎样将纹理像素映射到纹理坐标。当你有一个很大的物体但是纹理的分辨率很低的时候这就变得很重要了。OpenGL也有对于纹理过滤(Texture Filtering)的选项。纹理过滤有很多个选项,但是现在我们只讨论最重要的两种:GL_NEAREST和GL_LINEAR。 Texture Pixel也叫Texel,你可以想象你打开一张.jpg格式图片,不断放大你会发现它是由无数像素点组成的,这个点就是纹理像素;注

m0_38144614的博客 1062

Opengl ES之纹理贴图

纹理可以理解为一个二维数组,它可以存储大量的数据,这些数据可以发送到着色器上。一般情况下我们所说的纹理是表示一副2D图,此时纹理存储的数据就是这个图的像素数据。所谓的纹理贴图,就是使用Opengl将这个纹理数据渲染出来,这个过程有点像装修工人给墙体贴瓷砖,而瓷砖好比作纹理。

u012944685的专栏 1790

OpenGL ES 3. 纹理采样 详述

大家好,接下来将为大家介绍OpenGL ES 3. 纹理采样。 纹理采样就是根据片元的纹理坐标到纹理图中取对应位置颜色的过程。但由于被渲染图元中的片元数量与其对应纹理区域中像素的数量并不一定相同,也 就是说图元中的片元与纹理图中的像素并不总是一一对应的。 例如,将较小的纹理图映射到较大的图元或将较大的纹理图映射到较小的图元时这种情况就 会产生。因此,通过纹理坐标在纹理图中并不一定能得到与之完全对应的像素,这时就需要采用一些策略使得纹理采样可以顺序进行下去。通常采用的策略有最近点采样、线性采样两种,

sy_liao的专栏 2670

LearnOpengl_纹理

纹理环绕方式 纹理坐标的范围通常是从(0, 0)到(1, 1),那如果我们把纹理坐标设置在范围之外会发生什么?OpenGL默认的行为是重复这个纹理图像(我们基本上忽略浮点纹理坐标的整数部分),但OpenGL提供了更多的选择: GL_REPEAT 对纹理的默认行为。重复纹理图像。 GL_MIRRORED_REPEAT 和GL_REPEAT一样,但每次重复图片是镜像放置的。 GL_CLAMP_TO_EDGE 纹理坐标会被约束在0到1之间,超出的部分会重复纹理坐标的边缘,产生一种边缘被拉伸的效果。 GL_CLAM

qq_40742335的博客 326
上一篇: android openGL中模板测试、深度测试功能的先后顺序
下一篇: Android OpenGL ES详解——纹理:多级渐远纹理
闲暇部落
博客等级 码龄12年 2775粉丝 215原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

闲暇部落

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值