版权声明:本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名elloop(包含链接)
作者是现在对相关知识理解还不是很深入,后续会不断完善。因此文中内容仅供参考,具体的知识点请以OpenGL的官方文档为准
前言
混合发生在片段着色之后。
本文介绍了OpenGL ES 2.0 中常用的多级纹理贴图技术,mipmap, 给出了一个使用mipmap的3D场景示例。
在三维计算机图形的贴图渲染中有一个常用的技术被称为Mipmapping。为了加快渲染速度和减少图像锯齿,贴图被处理成由一系列被预先计算和优化过的图片组成的文件,这样的贴图被称为 MIP map 或者 mipmap。这个技术在三维游戏中被非常广泛的使用。“MIP”来自于拉丁语 multum in parvo 的首字母,意思是“放置很多东西的小空间”。Mipmap 需要占用一定的内存空间,同时也遵循小波压缩规则 (wavelet compression)
mipmap的常见使用场景是,在一个采用透视投影的三维场景中,我们看到的东西是近大远小的,对于同一种东西,比如地板,近处使用像素尺寸较大的纹理,远处的使用像素较小的纹理,这样就节省了渲染的工作量。通过使用OpenGL的glTexImage2D函数可以实现多级纹理的加载,它的第二个参数就是纹理的级别。
效果图
从近到远,分别是不同级别图片绘制的结果,越远的位置图片像素越少。
实现
制作六张图片,大小分别为32x32, 16x16, 8x8, 4x4, 2x2, 1x1,如图,使用“绘图”工具,依次创建6个图片,画一个矩形,中间用纯色填充:
1x1像素的图:
32x32像素的图:
制作好的6个级别的图片依次如下所示,其中1x1的太小了,与16x16的都为红色:
把图片保存为p1x1.bmp ~ p32x32.bmp。接下来要在OpenGL程序中把它们组合成一个多级纹理,我该怎么做呢?
下面是代码示例,先来怎么定义一个函数把多张图片打包成一个mipmap.
通过调用这个loadMipMap()
函数,我就可以创建出mipmap形式的多级纹理了,下面我把创建出的纹理贴在一个透视投影的三维场景里,我先把render的代码贴在这吧:
顶点shader
片段shader
完整的源代码
MipMapTexture.h
MipMapTexture.cpp
完整项目源码
如果源码对您有帮助,请帮忙在github上给我点个Star, 感谢 :)
在这里也能看到这篇文章:github博客, CSDN博客, 欢迎访问