OpenGL-ESnbsp;中的nbsp;mipmappingnbsp;…

2024-08-31 18:48

本文主要是介绍OpenGL-ESnbsp;中的nbsp;mipmappingnbsp;…,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原文地址:OpenGL-ES 中的 mipmapping 算法 作者:雁子

    最近刚把mipmapping在ES中实现完成,在这里想总结一下算法,并讨论一下相关的结果。

    Mipmap在3D图形学中主要是用来做anti-aliasing,这跟图像学中的概念是一致的:图像在缩小时因为采样率不够,就会导致混叠现象,如果是线,就表现为断线,如果是纹理比较复杂,就表现为纹理变得杂乱。在图形学中,我们经常会用到纹理贴图(注意:图形学中的纹理与图像学中的是两个概念,图像中一般将图片中较复杂的区域,即频谱能量高的,称为纹理;图形学中将用来贴图的图片统称为纹理),用来贴图的纹理大小与真正要render的区域不一定是刚好匹配的,这样就需要做放大或缩小,如果缩小,也就会产生上面所述的混叠现象。

    图形学中经常会用到z值来控制物体的远近,有时会在一个多边形中用z值变化来生成纵深感很强的物体,这时在一个多边形内部的纹理贴图就会用到不同的缩小比率,如果只用原始的纹理去采样,就会在缩小比率大的地方(通常是z值大的地方)出现混叠。1983年,Lance willians在他的论文“Pyramidal Parametrics”中提出了一种解决上述问题的方法。他将原始纹理逐步做下采样(即图像缩小),从而生成一系列的不同大小的纹理,这些纹理被称为mipmap,使用时按照缩小比率来选择合适大小的纹理。比如,我们要用做贴图的纹理大小为 64x32,对它做下采样生成32x16,16x8,8x4,4x2,2x1,1x1的纹理,如果要render的区域大小为14x6,那么我们要么选16x8的纹理贴,要么选16x8与8x4的两块纹理做完线形平均的结果贴。

    这样看来,做mipmapping分为三个步骤,第一个步骤为选择合适的下采样方法来生成mipmaps。在图像学中,图像缩小时产生的混叠常用一些低通滤波器来减轻,即在缩小前先将图像做一个低通滤波。这个滤波器有多种选法,简单的可以是box平均滤波,复杂点可以是各向异性的滤波器,它常是由某些偏微分方程的数值解得到的,好处是在平滑的同时可以保持边缘的清晰度。这些在mipmapping中也可以使用,一般来说,我们都使用简单的box filter即可。

    第二个步骤就是计算缩小比率d,这是算法中的关键。这个算法也有好几类,我使用的是将像素看做是正方形的那一类,也是ES spec上给出的算法,即: d = sqrt( max((Ux^2 + Vx^2) , (Uy^2 + Vy^2)) );为了去掉乘法和开根号的运算,我又将其简化为:d = max((Ux + Vx) , (Uy + Vy));这个也满足spec上的要求。另一方面,如果对三角形中的每点都计算d,那就太费时间,所以就只对整个三角形算出一个d值,在内层循环中只对d做透视修正和下面的第三个步骤。如果是正投影,那内层循环就没有增加任何计算量。

    第三个步骤是根据d值确定选取哪一个mip做贴图对象。这个很简单,如果是linear_mipmaps_nearest,那么level = floor(log2(d+0.5));如果是linear_mipmaps_linear,level = floor(log2(d)); fraction =  d - floor(log2(d));用level层和level+1层的数据用fraction做混合后在贴图。

    从算法效果上来看,和OpenGL做出的结果基本一致,说明算法是正确的。从算法速度上来看,用GLBenchmark1.0 跑出的linear_mipmaps_nearest降了将近一成,linear_mipmaps_linear降了1.7成。

    一点讨论:此算法用linear_mipmaps_nearest时对我们应用的速度影响不太大,但是在level切换时能够比较明显看出切换动作;用linear_mipmaps_linear时看不出切换动作,可是对速度影响较大。另外,目前的box filter还是会造成过度模糊的现象。所以对于3D GUI等的应用,是清晰,快速,但是会闪烁重要呢?还是会平滑过渡无闪烁,但却模糊速度慢点更重要?这两者的权衡是个值得探讨的问题,还是要对具体应用具体分析了。

 

两个有用的网站:http://www.gamasutra.com/features/19981211/flavell_01.htm

                http://www.lihuasoft.net/article/show.php?id=4509

一篇参考文章:http://scholar.ilib.cn/A-jsjyy200412006.html

这篇关于OpenGL-ESnbsp;中的nbsp;mipmappingnbsp;…的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1124709

相关文章

OPENGL顶点数组, glDrawArrays,glDrawElements

顶点数组, glDrawArrays,glDrawElements  前两天接触OpenGL ES的时候发现里面没有了熟悉的glBegin(), glEnd(),glVertex3f()函数,取而代之的是glDrawArrays()。有问题问google,终于找到答案:因为OpenGL ES是针对嵌入式设备这些对性能要求比较高的平台,因此把很多影响性能的函数都去掉了,上述的几个函数都被移除了。接

OpenGL ES学习总结:基础知识简介

什么是OpenGL ES? OpenGL ES (为OpenGL for Embedded System的缩写) 为适用于嵌入式系统的一个免费二维和三维图形库。 为桌面版本OpenGL 的一个子集。 OpenGL ES管道(Pipeline) OpenGL ES 1.x 的工序是固定的,称为Fix-Function Pipeline,可以想象一个带有很多控制开关的机器,尽管加工

OpenGL雾(fog)

使用fog步骤: 1. enable. glEnable(GL_FOG); // 使用雾气 2. 设置雾气颜色。glFogfv(GL_FOG_COLOR, fogColor); 3. 设置雾气的模式. glFogi(GL_FOG_MODE, GL_EXP); // 还可以选择GL_EXP2或GL_LINEAR 4. 设置雾的密度. glFogf(GL_FOG_DENSITY, 0

opengl纹理操作

我们在前一课中,学习了简单的像素操作,这意味着我们可以使用各种各样的BMP文件来丰富程序的显示效果,于是我们的OpenGL图形程序也不再像以前总是只显示几个多边形那样单调了。——但是这还不够。虽然我们可以将像素数据按照矩形进行缩小和放大,但是还不足以满足我们的要求。例如要将一幅世界地图绘制到一个球体表面,只使用glPixelZoom这样的函数来进行缩放显然是不够的。OpenGL纹理映射功能支持将

OpenGL ES 2.0渲染管线

http://codingnow.cn/opengles/1504.html Opengl es 2.0实现了可编程的图形管线,比起1.x的固定管线要复杂和灵活很多,由两部分规范组成:Opengl es 2.0 API规范和Opengl es着色语言规范。下图是Opengl es 2.0渲染管线,阴影部分是opengl es 2.0的可编程阶段。   1. 顶点着色器(Vert

OpenGL/GLUT实践:流体模拟——数值解法求解Navier-Stokes方程模拟二维流体(电子科技大学信软图形与动画Ⅱ实验)

源码见GitHub:A-UESTCer-s-Code 文章目录 1 实现效果2 实现过程2.1 流体模拟实现2.1.1 网格结构2.1.2 数据结构2.1.3 程序结构1) 更新速度场2) 更新密度值 2.1.4 实现效果 2.2 颜色设置2.2.1 颜色绘制2.2.2 颜色交互2.2.3 实现效果 2.3 障碍设置2.3.1 障碍定义2.3.2 障碍边界条件判定2.3.3 障碍实现2.3.

OpenGL——着色器画一个点

一、 绘制 在窗口中间画一个像素点: #include <GL/glew.h>#include <GLFW/glfw3.h>#include <iostream>using namespace std;#define numVAOs 1GLuint renderingProgram;GLuint vao[numVAOs];GLuintcreateShaderProgram (){c

试用GLFW并创建OpenGL和DX的环境

介绍GLFW GLFW官网:https://www.glfw.org/ GLFW is an Open Source, multi-platform library for OpenGL, OpenGL ES and Vulkan development on the desktop. It provides a simple API for creating windows, contex

鸿蒙(API 12 Beta6版)图形加速【OpenGL ES平台内插模式】超帧功能开发

超帧内插模式是利用相邻两个真实渲染帧进行超帧计算生成中间的预测帧,即利用第N-1帧和第N帧真实渲染帧预测第N-0.5帧预测帧,如下图所示。由于中间预测帧的像素点通常能在前后两帧中找到对应位置,因此内插模式的预测帧效果较外插模式更优。由于第N帧真实渲染帧需要等待第N-0.5帧预测帧生成并送显后才能最终送显,因此会新增1~2帧的响应时延。 OpenGL ES平台 业务流程 基于OpenGL

OpenGL DMA接口

Opengl的DMA版本接口主要作用是解决以前访问opengl对象, 必须先将对象绑定到当前状态机下才能访问的问题,这会导致驱动层需要去频繁的进行对象的引用查找。  比如以前非DMA版本的接口操作顶点数据  glGenBuffers(1, &vbo);glBindBuffer(GL_ARRAY_BUFFER, vbo);glBufferData(GL_ARRAY_BUFFER, sizeof