Android OpenGL ES详解——纹理:多级渐远纹理

Android OpenGL es 纹理坐标设定与贴图规则 当opengl对一个四方形进行贴图时,会定义纹理贴图坐标,一串数组,相信初学openggl es者看到后会很头疼,不知道写得是什么东西。现在就将我的研究成果与大家分享下!当纹理映射启动后绘图时,你必须为OpenGL ES提供其他数据,即顶点数组中各顶点的纹理坐标。纹理坐标定义了图像的哪一部分将被映射到多边形。它的工作方式有点奇怪。相信初学者看到后会很头疼,不知道写得是什么东西。现在就将我的研究成果与大家分享下!下面看下在android平台下Opengl纹理系统坐标,左下角为原点。我们现在讨论怎样使用这些纹理 阅读详情

目录

一、背景

二、概念

1、原理

2、优缺点

三、常用函数

四、应用举例


一、背景

在使用OpenGL渲染大量具有纹理的物体时,特别是在处理远处物体时遇到的一个常见问题:纹理分辨率与物体距离之间的不匹配问题。下面是这段话的详细解释:

  1. 场景描述:假设有一个包含上千个物体的大房间,每个物体都有纹理。这意味着场景是复杂且细节丰富的。

  2. 纹理分辨率与距离的关系:在真实世界中,当我们观察远处的物体时,这些物体的细节会显得模糊,因为我们的眼睛无法分辨出远处的细微纹理。但在计算机图形学中,即使物体很远,如果给它们应用高分辨率的纹理,OpenGL仍然会尝试从这些高分辨率纹理中为每个片段(像素或屏幕上的一个小区域)获取颜色值。

  3. OpenGL的困难:当远处的物体只占据屏幕上的很少片段时,OpenGL会遇到一个问题:如何从高分辨率纹理中准确地选择出代表这些远处片段的颜色值。因为每个片段可能覆盖了纹理上的很大一块区域,OpenGL需要决定使用纹理中的哪个具体点来代表这个片段的颜色。这可能导致颜色选择不准确,因为单个片段可能跨越了纹理上颜色变化很大的区域。

  4. 视觉效果问题:由于上述原因,远处的物体可能会显得不真实。例如,一个远处的墙壁可能看起来像是由大块的不同颜色的色块组成,而不是一个平滑、统一的纹理。

  5. 内存浪费:为远处的物体使用高分辨率纹理还会浪费内存资源。因为这些纹理需要大量的存储空间,而远处的物体由于屏幕空间有限,实际上并不需要这么高的分辨率来呈现。

简而言之,这段话指出了在使用OpenGL渲染复杂场景时,如果不对远处物体的纹理分辨率进行适当处理(比如通过降低纹理分辨率或使用某种形式的纹理映射技术,如mipmap),就可能会遇到视觉效果不佳和内存资源浪费的问题。

二、概念

针对上述问题,OpenGL使用一种叫做多级渐远纹理(Mipmap)的概念来解决这个问题。用于在游戏开发中优化性能。通过构建纹理金字塔,随着物体远离摄像机,使用低精度纹理降低显存带宽和渲染负担。虽然会额外占用33%的内存,但能显著提升渲染效率。

​在游戏开发的后期, 最头疼的时候莫过于优化游戏性能, 这其中对于加载资源时消耗的优化,用的最多的莫过于MipMap。

多级渐远纹理,简单来说就是一系列的纹理图像,后一个纹理图像是前一个的二分之一。多级渐远纹理背后的理念很简单:距观察者的距离超过一定的阈值,OpenGL会使用不同的多级渐远纹理,即最适合物体的距离的那个。由于距离远,解析度不高也不会被用户注意到。同时,多级渐远纹理另一加分之处是它的性能非常好。让我们看一下多级渐远纹理是什么样子的:

假设我们有一个正方形的纹理贴图,分辨率为512x512像素。该纹理贴图用于映射到一个距离相对远的平面上。它们旨在提高渲染速度并减少锯齿伪影。高分辨率 mipmap 图像用于高密度样本,例如靠近相机的物体;当物体看起来较远时,使用较低分辨率的图像。

在没有Mipmap的情况下,如果我们直接将512x512的纹理贴图映射到远处的平面上,由于远处的像素数量较少,会导致纹理缩小的情况。这可能会导致失真和锯齿效应。

现在,我们使用Mipmap来优化纹理过滤。根据Mipmap的原理,我们生成一系列不同分辨率的图像,每个级别是前一级别的一半分辨率。假设我们生成了以下级别的Mipmap纹理:

Level 0: 512x512
Level 1: 256x256
Level 2: 128x128
Level 3: 64x64
Level 4: 32x32
Level 5: 16x16
Level 6: 8x8
Level 7: 4x4
Level 8: 2x2
Level 9: 1x1

在渲染过程中,当我们将纹理映射到远处的平面上时,根据距离和像素数量,我们选择最接近所需分辨率的Mipmap级别进行插值。

假设远处的平面上每个像素区域相当于纹理上的4x4像素区域。在这种情况下,Level 7的分辨率是4x4,因此,应该使用Level 7的Mipmap级别进行插值计算,将Level 7的纹理映射到远处的每个像素上。

1、原理

  • MipMap(mipmapping)多级渐远纹理技术,又被称为“纹理贴图金字塔”,其中 “mip” 是拉丁文 “multum in parvo” 的缩写,它的意思是 “在一个小空间中有许多东西”。

  • 多级渐远纹理技术原理:提前用滤波(有兴趣的朋友Unity纹理贴图属性Filter Mode有介绍,这里不过多叙述)处理来得到很多更小的图像,形成一个图像金字塔,每一层都是对上一层降采样的结果。这样在实际运行时,就能快速得到结果像素。当物体远离摄像机时,可以直接使用较小的纹理(纹理质量稍差,模糊感较强),当物体靠近时适当替换较大纹理(纹理质量好,模糊感较少),以便给玩家呈现更精致的画面。

2、优缺点

  • 优点

当物体远离时,无需高精度纹理展示时,则替换低精度纹理,降低了显存带宽,减少了渲染。

  • 缺点

为了适配多场景(远近个不同的场景)提前生成八张精度不同的纹理,使用一定的空间用用于存储这些多级渐远纹理,通常会多占用33%的内存空间,典型的利用空间换取时间的办法。

三、常用函数

  • glGenerateMipmaps

手工为每个纹理图像创建一系列多级渐远纹理很麻烦,幸好OpenGL有一个glGenerateMipmaps函数,在创建完一个纹理后调用它OpenGL就会承担接下来的所有工作了。

在渲染中切换多级渐远纹理级别(Level)时,OpenGL在两个不同级别的多级渐远纹理层之间会产生不真实的生硬边界。就像普通的纹理过滤一样,切换多级渐远纹理级别时你也可以在两个不同多级渐远纹理级别之间使用NEAREST和LINEAR过滤。为了指定不同多级渐远纹理级别之间的过滤方式,你可以使用下面四个选项中的一个代替原有的过滤方式:

过滤方式描述
GL_NEAREST_MIPMAP_NEAREST使用最邻近的多级渐远纹理来匹配像素大小,并使用邻近插值进行纹理采样
GL_LINEAR_MIPMAP_NEAREST使用最邻近的多级渐远纹理级别,并使用线性插值进行采样
GL_NEAREST_MIPMAP_LINEAR在两个最匹配像素大小的多级渐远纹理之间进行线性插值,使用邻近插值进行采样
GL_LINEAR_MIPMAP_LINEAR在两个邻近的多级渐远纹理之间使用线性插值,并使用线性插值进行采样

就像纹理过滤一样,我们可以使用glTexParameteri将过滤方式设置为前面四种提到的方法之一:

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

一个常见的错误是,将放大过滤的选项设置为多级渐远纹理过滤选项之一。这样没有任何效果,因为多级渐远纹理主要是使用在纹理被缩小的情况下的:纹理放大不会使用多级渐远纹理,为放大过滤设置多级渐远纹理的选项会产生一个GL_INVALID_ENUM错误代码。

四、应用举例

使用前:

使用后:

推荐文章:

Unity优化技术-详细介绍MipMap技术原理以及实现_mipmap介绍-优快云博客

https://juejin.cn/post/7369620466397675570

OpenGL与3D开发-应用纹理贴图 应用纹理贴图 文章目录应用纹理贴图1、纹理的基本概念2、纹理坐标2.1坐标映射3、纹理映射的步骤是1. 启用纹理映射功能2.创建纹理对象3. 设置纹理属性4. 指定纹理5.纹理映射6.绑定纹理4、纹理环绕(Texture Wrapping)5、纹理过滤5.1 有三种情况:5.2 OpenGL允许我们为放大和缩小分配过滤器,并允许我们使用最邻近、双线性和三线性过滤。5.3 OpenGL 纹理过滤模式5.4 设置纹理过滤6、多级渐远纹理 1、纹理的基本概念 ???? 纹理(TEXTURE),即物体表面的样子 阅读详情

相关推荐

Android OpenGL ES纹理总结、纹理坐标系说明、使用代码示例

#.纹理介绍: 可以简单想象成一张皮,可以贴在OpenGL空间中自己指定的区域之上,从而实现需要的视觉效果。 ##.使用纹理的好处: 如果想让图形看起来更真实,就必须有足够多的顶点,还要设置相应的颜色属性,会产生很多性能开销。 而如果是使用在指定的位置贴上一层纹理的方式,不需要非常多顶点,只需要纹理绘制满足需要,OpenGl中顶点位置与纹理对应位置关联正确。就可以达到需要的细节显示效果。 ##."需要蒙皮"位置与纹理的对应关系 纹理有自己内部的坐标系,纹...

u013914309的博客 3381

初识OpenGL (-)多级渐远纹理(Mipmap)

有一个包含着上千物体的大房间,每个物体上都有纹理。由于远处的物体可能只产生很少的片段,OpenGL从高分辨率纹理中为这些片段获取正确的颜色值就很困难,因为它需要对一个跨过纹理很大部分的片段只拾取一个纹理颜色。就像普通的纹理过滤一样,切换多级渐远纹理级别时你也可以在两个不同多级渐远纹理级别之间使用NEAREST和LINEAR过滤。这样没有任何效果,因为多级渐远纹理主要是使用在纹理被缩小的情况下的:纹理放大不会使用多级渐远纹理,为放大过滤设置多级渐远纹理的选项会产生一个GL_INVALID_ENUM错误代码。

thefist的专栏 1595

android opengl es添加纹理,绘制立方体纹理,立方体使用不同纹理

绘制立方体纹理,立方体6个面使用不同纹理

u012761326的博客 3124

音视频开发之旅(12) OpenGL ES之纹理

目录 纹理相关的基本概念 纹理绘制的流程以及关键方法 实践(纹理加载、二分屏、三分屏、八分屏、镜像、纹理和颜色混合) 遇到的问题 收获 一、基本概念 纹理 纹理(Texture)是一个2D图片(甚至也有1D和3D的纹理),它可以用来添加物体的细节;把它像贴纸一样贴在什么东西上面,让那个东西看起来像我们贴纸所要表现的东西那样。从而使图形更加真实 纹理坐标 OpenGL中纹理坐标系是以纹理左下角为坐标原点的,而图片中像素的存储顺序是从左上到右下的,因此我们需要对我们的坐标系进行一次Y轴的“翻转

yabin的专栏 714

Android OpenGL ES从入门到进阶(二)—— OpenGL ES 2.0渲染纹理到屏幕

源码链接:https://github.com/smzhldr/AGLFramework 框架源码可以方便进行剪裁、定制,基本可以满足项目级别的开发需求。 一、前言 在进行该框架的进一步学习和高级使用之前,我觉得有必要复习一下相机预览的,因为相机的预览在美颜相机的开发中扮演者无可替代的角色。 SurfaceView在相机的预览中逐步淡出人们的视野,TextureView使用更加简单方便,但在特效制...

liuderong0的博客 1773

android 使用OPENGL ES实现纹理拉伸效果-纹理映射基础

效果图: 编写dad.java文件          *声明三个矩形,分别贴s,t的最大值为1X1、4X4、4X2的纹理涂,在场景中分别绘制1X1、4X4、4X2的纹理矩形       *设置视窗的大小、矩阵类型、并设置投影模式为透视投影       *定义封装方法initTexture()以获取纹理ID,该方法通过收取图片ID,生成一个纹理ID并返回 pac

刘国栋的博客 2657

Unity中Shader纹理的多级渐远Mipmap

Unity中Shader纹理的多级渐远MipmapMipmap

楠溪泽岸的博客 1762

Android OpenGL ES学习笔记之添加纹理

texture在游戏制作里面指贴图,又称纹理。游戏制作需要用到大量的图片素材,尤其是3D游戏。游戏制作的时候会存放图片到texture里面,运行游戏时会读龋如果坏掉…

Dennis-Android的博客 4912

OpenGL纹理、多级渐远纹理

一.基础概念讲解 纹理坐标 每个顶点都需要知道自己对应着纹理的那个部分,从而可以进行纹理采样,这就是通过为顶点设置纹理坐标来实现的。 之后对于图形的其它片段来说,根据片段插值来得到自己的采样坐标。 纹理坐标起始于(0,0),在纹理图片的左下角,终于(1,1),纹理图片右上角。那么当我们为顶点指定了纹理坐标的时候,如果不在(0,1)这个范围区间会怎样,这里就需要提到纹理环绕方式了, 也就是...

mozhi 3365

OpenGL ES 3.0 开发(二):纹理映射

什么是纹理 现实生活中,纹理(Texture)最通常的作用是装饰 3D 物体,它就像是贴纸一样贴在物体表面,丰富物体的表面和细节。 在 OpenGLES 开发中,纹理除了用于装饰物体表面,还可以用来作为存储数据的容器。 那么在 OpenGL 中,纹理实际上是一个可以被采样的复杂数据集合,是 GPU 使用的图像数据结构,纹理分为 2D 纹理、 立方图纹理和 3D 纹理。 2D 纹理是 OpenGLE...

字节流动 4万+

OpenGL ES纹理贴图实战指南

OpenGL ES(Open Graphics Library for Embedded Systems)是OpenGL的一个子集,专为移动设备和嵌入式系统设计,以实现高性能的2D和3D图形渲染。其轻量级和跨平台的特性使其成为开发手机游戏和应用程序的首选图形API。在深入探讨OpenGL ES的纹理贴图之前,先来了解其基本架构和概念。OpenGL ES通过一套精简的API来管理图形渲染管线,这包括顶点处理、片元处理、纹理映射、光照和混合等步骤。

weixin_33812391的博客 861

Android OpenGL ES详解——纹理

我们已经了解到,我们可以为每个顶点添加颜色来增加图形的细节,从而创建出有趣的图像。但是,如果想让图形看起来更真实,我们就必须有足够多的顶点,从而指定足够多的颜色。这将会产生很多额外开销,因为每个模型都会需求更多的顶点,每个顶点又需求一个颜色属性。艺术家和程序员更喜欢使用。是一个2D图片(甚至也有1D和3D的纹理),它可以用来添加物体的细节;你可以想象纹理是一张绘有砖块的纸,无缝折叠贴合到你的3D的房子上,这样你的房子看起来就像有砖墙外表了。

闲暇部落 1294

【提示学习代码】CoOp代码详读

CoOp是对CLIP的改进工作,主要是对prompt进行学习从而不用来手动设置prompt。自定义CLIP模型:上述两个模块结合而成的CLIP。文本编码器,接收文本的输入,并输出相应的编码表示。将图像和文本进行编码并计算它们之间的相似性。permute后变成了(4,2,3)Prompt学习器,用于学习生成提示。

weixin_51293984的博客 5816

Android OpenGL ES 学习(七) – 纹理

上一章中 Android OpenGL ES 学习(六) – 使用 VBO、VAO 和 EBO/IBO 优化程序,我们已经学习了 VBO、VAO 和 EBO/IBO 的知识,这一章,一起来学习 OpenGL 纹理相关的只是。今天要完成的效果,加载一张图片: 可能第一印象是一张二维图片,如下图: 但在OpenGL的世界里,这里有点不一样,它与光栅化有点像,光栅化过程中,会切成一片片小片段,然后片段着色器中把颜色值赋给图元表面。 纹理也相似,它包含一张或多张图片信息(也可以是其他数据)的一个 OpenG

夏至的稻穗的博客 4856

ESP32 Arduino 学习篇(五)TFT_eSPI库

该库有User_Setup.h和 User_Setup_Select.h两个配置文件,支持 ①自定义参数或 ②使用已有配置 驱动TFT屏幕。优点是: 1. 占用空间非常小 2. 动画清晰,充分利用每个像素点 3. 可以非常灵动. 4. 方便进行微调。首先在Libraries里面搜索安装TFT_eSPI库到你的工程文件里面。初始化屏幕, 如果是ST7735,可以往里面传一个参数, 具体用到时再看。缺点是: 1. 容易闪屏 2. 一般不会太复杂 3.需要大量的计算。特别注意: 字库7是仿7段数码屏的样式。

DOF526570的博客 2万+

半导体EAP系统入门指南:从零开始理解设备自动化程序(附实战案例)

本文深入浅出地介绍了半导体制造中EAP(设备自动化程序)系统的核心作用与工作原理。EAP作为连接MES与生产设备的桥梁,负责指令翻译、数据采集与实时控制,是实现晶圆厂全自动化的关键。文章通过对比手动与自动模式,阐述了EAP在提升效率、保障良率方面的价值,并提供了一个实战案例,帮助读者从零构建对半导体CIM体系中这一关键组件的理解。

weixin_29200741的博客 734

Android OpenGL ES - 纹理

纹理基本概念 纹理是一个2D图片(甚至也有1D和3D的纹理) 纹理坐标 为了能够把纹理映射(Map)到三角形上,我们需要指定三角形的每个顶点各自对应纹理的哪个部分. 这样每个顶点就会关联着一个纹理坐标(Texture Coordinate),用来标明该从纹理图像的哪个部分采样(译注:采集片段颜色)。之后在图形的其它片段上进行片段插值(Fragment Interpolation)。 纹理坐标在x和y轴上,范围为0到1之间(注意我们使用的是2D纹理图像)。使用纹理坐标获取纹理颜色叫做采样(Samplin

fdsafwagdagadg6576的专栏 849

Opencv4.5.1 微信二维码识别功能 QRCode 编译与使用 C++

部分参考:https://mp.weixin.qq.com/s/2GZAJAUPHTXFOKDRv-D21Q 一、下载源码 https://github.com/opencv 二、源码编译 ① 在cmake中添加源码编译路径和生成路径,第一次点击configure。 ② 添加contrib路径 第一次configure后,找到OPENCV_EXTRA_MODULES_PATH,将contrib路径添加进来,注意要具体到modules/,继续configure。 ..

zaibeijixing的专栏 1万+

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的部分其实只看它的小数

weiersyuan的专栏 2403

Rapid SCADA MQTT

一、配置RapidSCADA 1、准备KpMqtt.dll、Jint.dll库文件,从网盘下载。 2、将以上两个文件拷贝到SCADA安装目录的Comm/KP目录下,如下: C:\SCADA\ScadaComm\KP 3、新建SCADA项目 4、新建Line 5、新建Device 6、拷贝Config目录下的KpMqtt_001.xml文件、KpMqtt_Job.js文件到项目Comm\Config下,如下示例链接 C:\SCADA\Projects\MQTTProject\Instances\Defau

mumanquan1的博客 3006

手机直连低轨卫星通信:架构、关键技术和未来展望

【摘 要】借助低轨卫星星座全时全域覆盖优势,手机直连卫星通信预期成为6G重要特征之一。首先介绍了手机直连卫星的测试验证、标准化与商业项目发展现状。其次,介绍了基于透明转发、部分可再生处理、完全可再生处理、集成接入和回传的四种手机直连低轨卫星网络架构及组网方式。通过分析手机直连低轨卫星网络场景下高移动性与大传输时延等带来的接入与传输问题,提出对地面移动通信体制进行适应性改进的关键技术方案。最后,探讨了未来手机直连低轨卫星发展发向和潜在思路。通过上述阐述与分析,提供未来发展手机直连低轨卫星通信的可行路径。【关

fzq0625的博客 1706

OpenGL ES 纹理以及纹理的映射

OpenGL ES 纹理以及纹理的映射

Lud的博客 931

LeRobot 官方论文:一个用于端到端机器人学习的开源库

本文介绍了一个名为LeRobot的开源库,旨在解决机器人学习领域的碎片化问题。该库提供了端到端的技术栈,包括统一的机器人中间件API、标准化的数据集格式(LeRobotDataset)、优化的推理栈以及多种最先进机器人学习算法的实现。LeRobot支持多种低成本开源机器人平台(如SO-10X、ALOHA-2等),通过共享中间件实现便捷的遥操作和数据收集。其数据集格式已广泛应用于社区,截至2025年9月已有16,000多个数据集公开共享。该库还支持流式处理大规模数据,降低了研究门槛。在模型方面,LeRobot

2506_90492529的博客 901

安卓进阶——OpenGL ES

本文系统介绍了OpenGL在2D和3D图形开发中的应用。2D部分重点阐述了OpenGL ES在Android平台的高性能优势、核心渲染管线(顶点处理、纹理映射、着色器编程)以及实现流程,包括GLSurfaceView配置和Renderer实现。3D部分深入讲解了坐标系转换、矩阵变换(MVP矩阵)、深度测试、光照模型等关键技术,并提供了3D场景渲染的实现框架。文章不仅覆盖了基础绘制方法,还介绍了纹理滤镜、粒子系统、帧缓冲等进阶技巧,为移动端图形开发提供了全面指导。通过系统学习这些内容,开发者可以实现...

Meteors.的博客 981

【libnice】meson + vs2022,生成win32工程

libnice

突围 947

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Android OpenGL ES2 一切从绘制纹理开始

android openGL ES2 一切从绘制纹理开始

把理性与逻辑灌入电光石火奔腾流淌的指令集…… 4731

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

上一篇: Android OpenGL ES详解——纹理:纹理过滤GL_NEAREST和GL_LINEAR的区别
下一篇: 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、付费专栏及课程。

余额充值