当前课程知识点:移动图形概论 > 第五章 颜色与纹理 > 5.3 立方体纹理 > 立方体纹理
各位同学 大家好
今天要为大家介绍的是OpenGL中的
立方体纹理
今天的主要内容包括
立方体纹理的基本概念和实现环境贴图的一种方法
立方体纹理也就是3D纹理
其结构是围绕着对象的
6个2D纹理组成的立方体
立方体贴图通常用作skybox
也就是环境贴图
可以作为场景中的环境背景
产生真实空间的效果
在需要反射和折射的建模应用中也有重要的应用
组成立方体贴图需要6个2D纹理
立方体的每个面需要一个
而环境的每个面都有一个识别方式
其中顶部和底部是+Y和-Y面
正面和背面是+Z和-Z面
左面和右面是-X和+X面
这个图是构成立方体贴图六个面的6个图像示例
是对一个真实场景的全景360度摄影图片
想象一下
把六个面的贴图对应的贴到一个巨大的立方体的内面
当观察者位于立方体中心的时候无论他朝什么方向观察
都和拍摄照片时的情景类似 有种身临其境的感觉
立方体贴图是一个立方体
2D纹理坐标在此不适用
因此 将使用3D向量来计算使用哪个纹理面
以及要使用纹理面上的哪个纹理元素
着色器语言中的有个函数叫textureCube
它可以通过一个3D向量来查询这个向量所指向的立方体内表面的位置
所对应纹理元素的取值
这是相关示例代码的运行效果
可以看到随着三角形的旋转
它的镜面表面可以准确的反射出周围的环境
可以按照常规纹理的加载方式来加载在立方体纹理
立方体纹理包括6个2D图像
在下面的示例中
来自6个2D图像的数据将保存在image1到image6中
第一行代码创建纹理对象
可在该对象中生成立方体纹理
第二行代码绑定立方体纹理对象
以便对其进行操作
这段代码基于6个2D图像创建立方体纹理
请注意
我们将各个图像分配到立方体纹理的不同面
例如
从image1获取的数据
将存储为立方体纹理的–Z面
这两行代码
定义立方体纹理的缩小和放大过滤模式
都采用了最优的插值算法
最后两行代码
指定立方体纹理的每一面
都将被限制在边缘以内
这有助于确保图像边缘无缝衔接
在大多数情况下
依然可以使用 PoverVR框架提供的textureUpload函数
来加载立方体纹理
只需向创建的纹理映射
提供PVR文件的文件名
例如在这里的示例代码中
加载了名称为 cubemap.pvr 的纹理文件
只需一行代码
就实现了前面六行代码的功能
我们的示例代码为 15_CubeMap
它通过 CubeMap
建立了一个巨大的立方体
然后在立方体的内表面进行贴图
在着色器程序中
采用这个立方体的世界坐标
作为3D向量的方向
进而用 textureCube函数进行纹理映射
接下来看一下具体代码
这个代码定义了六个面的12个三角形的顶点
需要注意的是每个三角形的顶点顺序
一定要使其法线方向指向内部
可以和同一个代码中的Cube类比较
每个三角形的顶点顺序都是不一样的
这段代码用来生成顶点数组
其中CS是缩放系数
相当于建立了一个边长为50个单位的立方体
每个顶点有9个数据
其中
前三个数据是顶点坐标
接下来六个数据
只是为了共用着色器代码
与其它模型的顶点数据结构一致
其中的3.0
代表这里保存的不是颜色值
也不是2D纹理
而是立方体纹理
后面的法线信息也没有使用 赋值为0
顶点着色器中
world Pos
是将顶点数组中的坐标乘以了MMatrix
也就是模型矩阵
得到的是世界坐标
在片段着色器中
对读入的第二个3维属性值texture_or_color进行判断
其中 r分量大于1
小于2.5的时候
是2D纹理
用texture2D来处理
大于2.5时是3D纹理
使用textureCube来计算片段的颜色
其中
sCubeMap是立方体纹理对应的采样器变量
这样立方体内部的颜色
就与3D纹理对应起来了
好 这节课的内容就到这里
谢谢大家
-1.1 课程基本情况介绍
--课程基本情况介绍
-1.2 GPU 相关基础知识
-1.3 OpenGL ES 技术发展历史
-1.4 PowerVR SDK 安装和使用
-第一章测试
-2.1 OpenGL ES 基本概念
-2.2 编写第一个图形程序
-2.3 主要 API 介绍
-第二章测试
-3.1 矢量和矩阵知识基础
-3.2 旋转与位移变换
--旋转与位移变换
-3.3 OpenGL ES 变换基础
-第三章测试
-4.1 着色器编程语言介绍
-4.2 着色器编程实例
--着色器编程实例
-第四章测试
-5.1 颜色的基本概念
--颜色的基本概念
-5.2 纹理素材的使用
--纹理素材的使用
-5.3 立方体纹理
--立方体纹理
-第五章测试
-6.1 光照的基本概念
--光照的基本概念
-6.2 光源模型
--光源模型
-6.3 使用着色器渲染颜色
-6.4 反射与折射
--反射与折射
-第六章测试
-7.1 基于物理渲染的基本概念
-7.2 基于图像的照明
--基于图像的照明
-7.3 PBR 的实现
--PBR 的实现
-第七章测试
-8.1 Vulkan 介绍
-8.2 SDK 中的实用工具介绍
-综合测试