当前课程知识点:移动图形概论 > 第五章 颜色与纹理 > 5.2 纹理素材的使用 > 纹理素材的使用
各位同学大家好
今天要为大家介绍的是
OpenGL 中的纹理
今天的主要内容
包括
二维纹理的基本知识介绍
和使用PowerVR工具
创建纹理的方法
以及纹理文件
使用过程中会用到的函数
在图形应用中
虽然可以通过
设置顶点颜色
来设计模型的外观
但对于复杂的图案
更加有效的方式
是利用图片来进行渲染
这种应用于
图形对象几何形状的图像
就被称为纹理
纹理通常是2D纹理
或者立方体纹理
这节课主要介绍前者
2D纹理
实际上就是图像数据组成的二维数组
因此
可以通过一对坐标
定位纹理的具体位置
这个坐标通常定义为
U和V组成的二维对
在应用于
对象的三角形几何形状时
顶点数组中
将提供纹理坐标
来定位纹理覆盖在三角形上的形式
作为纹理的图像尺寸
最好是2的整数次幂
例如
2x2 4x4
也可以是长方形
如
32x16
128x32 等
在OpenGL中
纹理映射的坐标范围
从左下角的 0.0 0.0
到右上角的 1.0 1.0
这些坐标
代表查找纹理元素的归一化坐标
如果在顶点数组中
使用的坐标
超出该归一化范围定义的纹理坐标
并将产生由纹理环绕模式定义的行为
我们将在后面说明纹理环绕模式
右面三角形的三个顶点
提供了三个纹理坐标
这样就可以将纹理数据
映射到这个三角形中了
纹理映射数据具有多种格式
格式的类型决定了
数据中保存的数据类型
例如
GL_RGB
用于在纹理映射中
保存
红色绿色和蓝色纹理元素数据
透明度有效值为1.0
GL_LUMINANCE
用于在纹理映射中
保存纹理元素灰度的亮度
有效值R = G = B = 亮度
A = 1.0
GL_ALPHA
用于在纹理映射中
保存纹理元素的透明度值
通常用于Alpha测试
比如
只有透明度大于某一阈值的
才可以被绘制
接下来
我们用代码来定义一个纹理
这个纹理只有四个点
分别定义为红绿蓝和黄色
每个颜色有RGBA四个分量
要把刚才定义的图像数组转换为
可用的纹理
还需要一些代码
这里可以看到示例代码
第一行
用 glGenTextures 函数创建纹理对象
用_texture变量作为句柄
第二行代
码绑定该纹理对象
以便对其进行操作
第一个参数
GL_TEXTURE_2D
表示正在创建2D纹理
第三行代码
将图像数组数据
提交给纹理对象
这三行代码与顶点缓冲区的创建类似
都是先Gen
然后Bind
最后传递数据
具体看一下
glTexImage2D函数的参数
第一个参数表明是2D纹理
第二个参数0和细节层次贴图有关
稍后介绍
GL_RGBA
指定纹理的内部格式
2
指定纹理宽度
下一个2指定纹理高度
接下来的0
指定边框大小
必须为0
GL_RGBA
指定纹理元素的内部格式
一般与纹理的内部格式相同
GL_UNSIGNED_BYTE
指定纹理元素数据的数据类型
最后的image
指定
指向存储器中图像数据的指针
最后两行代码
定义纹理映射的缩小和放大过滤模式
一般使用线性插值的方式
进行计算放大
或者缩小的最优取值
在大多数情况下
用数组创建纹理比较不直观
可以使用保存好的纹理文件提供数据
PowerVR框架
提供textureUpload函数
通过保存在文件中的纹理数据
创建纹理对象
textureUpload有三个参数
第一个参数
指定资源提供者的名称
一般可以使用
我们用PVR框架建立的
Shell实例
第二个参数是
文件文件的文件名
第三个参数
指定OpenGL ES的版本
是否为2
细节层次贴图或者叫mip贴图
是一系列不同分辨率的纹理映射
对应不同的缩放级别
这里可以看到
0级1级和2级的纹理图像
后一个级别的边长
是前一个边长的一半
最小可以是1x1的纹理
在介绍glTexImage2D函数
第二个参数的0
就是指定0级的纹理映射数据
mip贴图
用于实现性能提升和减少伪影
如果在场景中
渲染的对象较小
则将使用较小版本的纹理数据
这将减小带宽并简化处理
也有助于确保对象较小时
拥有合适的外观
例如
不同级别的纹理
可由艺术家创建
而不是使用
大纹理中的少量样本进行创建
OpenGL
还提供了
glGenerateMipmap函数
来自动生成mip贴图
它根据已经创建的0级纹理
生成完整的不同级别纹理数据
这个函数只有一个参数
是生成贴图的纹理目标
可以是
GL_TEXTURE_2D
GL_TEXTURE_CUBE_MAP
可即使具有完整的mip贴图
渲染的三角形尺寸
也不一定能和纹理图片一致
因此
对于缩放的处理方式就要进行设置
图形硬件将根据片段
自动决定
执行哪种类型的过滤
如果对象大于最大纹理
将始终
对最大纹理进行采样
可以使用glTex
Parameter()设置过滤模式的参数
不同的参数设置
对生成纹理的质量
及花费的时间产生影响
glTexParameter()函数有四个版本
后缀为“i”的版本用于整数参数
后缀为“f”版本用于浮点参数
后缀“v”版本与数组值一起使用
第一个参数 target
用于指定目标纹理
分别对应2D和3D纹理
函数的第二个参数
用来指定纹理的可设置参数
其中
GL_TEXTURE_MIN_FILTER
用于设置缩小模式
GL_TEXTURE_MAG_FILTER
用于设置放大模式
GL_TEXTURE_WRAP_S
GL_TEXTURE_WRAP_T
用于设置在给定坐标
超出归一化范围的纹理坐标时
如何使用纹理
在设置缩小模式时
函数的第三个参数
可以设置为六个算法类型
GL_NEAREST
将根据所提供的纹理坐标
返回
纹理元素的最接近的单点采样值
GL_LINEAR 算法
将根据
与纹理坐标最近的四个点
返回纹理元素的双线性插值
这两个算法
都不使用mip贴图
第三个算法
返回GPU自动选择的
最接近贴图等级的单点采样值
第四个算法
返回由GPU自动选择的
两个最接近贴图等级的单点采样值
然后再做线性插值
GL_LINEAR_MIPMAP_NEAREST
返回
最接近所选贴图等级的
双线性采样值
GL_LINEAR_MIPMAP_LINEAR
返回
最接近两个所选贴图等级的
双线性采样值的
线性插值
这通常称为
三线性过滤
可实现所有OpenGL ES核心模式的
最佳质量
对于放大过滤
由于始终使用最大纹理
因此
参数只能是
GL_NEAREST
GL_LINEAR
含义与缩小模式中同名参数一致
如果顶点数组中
定义的纹理坐标
不在 0 1范围内
就会发生环绕
当设置环绕模式时
也就是
pname = GL_TEXTURE_WRAP_S
GL_TEXTURE_WRAP_T
函数第三个参数
可以是这里显示的三个宏
我们以下图纹理为例
看一下不同设置的效果
这里蓝色虚线只是标识了图像范围
并不是纹理的一部分
GL_CLAMP_TO_EDGE
会使
超出纹理坐标限制的部分
取值为边界值
相当于边界得到了扩展
再次提示一下
蓝色虚线框
不是纹理的一部分
因此不会出现在实际结果中
GL_REPEAT
会使
超过纹理坐标的部分
形成重复图案
也相当于
纹理坐标的整数部分被忽略
只使用小数部分
GL_MIRRORED_REPEAT
与GL_REPEAT相似
但纹理坐标经过镜像处理
显示出图片中展示的模式
好
今天的课程就到这里
谢谢
-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 中的实用工具介绍
-综合测试