Files
engine/docs/zh/graphics/texture/texture.md
AZhan 4c85668e09 fix link error (#2292)
* fix: doc link
2024-08-02 21:37:40 +08:00

8.7 KiB
Raw Blame History

order, title, type, group, label
order title type group label
0 纹理总览 图形 纹理 Graphics/Texture

纹理(Texture, 是在 3D 渲染中最常用到的资源。我们在给模型着色时,需要给每个片元设置一个颜色值,这个色值除了直接手动设置,我们还可以选择从纹理中读取纹素来进行着色,来达到更加丰富的美术效果。

值得注意的是图片、canvas 画布、原始数据、视频等都可以用来当作纹理Galacean 引擎目前支持所有 WebGL 标准的纹理。

我们会发现,引擎中大量的问题都来源于不同空间之间的映射(例如 MVP 变换),纹理也是如此,开发者不仅需要了解图片空间到纹理空间的映射关系,也需要了解纹素到像素的映射规则。

本文将主要介绍:

纹理类型

类型 描述
2D 纹理 最常用的美术资源,使用二维 UV 坐标进行采样
立方纹理 6 张 2D 纹理组成了一个立方纹理,可以用来实现天空盒、环境反射等特效
2D 纹理数组 只占用一个纹理单元,非常适合用来实现需要切换纹理图集的需求

纹理空间

纹理空间是由纹理形状决定的, 2D 纹理对应需要使用二维空间向量进行纹理采样,相应地,立方纹理需要使用三维空间向量进行纹理采样。

Texture 2D
Texture 2D
Texture Cube
Texture Cube

通用属性

虽然纹理类型多样,但他们都有一些相似的基本属性与设置:

属性
循环模式 UwrapModeU 截取模式(Clamp)、 重复模式(Repeat)、镜像重复模式(Mirror
循环模式 VwrapModeV 截取模式(Clamp)、重复模式(Repeat)、 镜像重复模式(Mirror
过滤模式(filterMode 点过滤(Point)、双线性过滤(Bilinear)、 三线性过滤(Trilinear
各向异性过滤等级(anisoLevel 1 ~ 16 ,具体要看设备支持情况

循环模式

纹理采样的范围为[0,1],那么当纹理 UV 坐标超出这个范围时,我们可以通过设置循环模式来控制如何进行超出部分的采样。

采样循环模式 解释
Clamp 超出范围采样边缘纹素
Repeat 超出范围从 [0,1] 开始重新采样
Mirror 超出范围从 [1,0] 开始镜像采样

过滤模式

一般来说纹素和屏幕像素不会刚好对应我们可以通过设置过滤模式来控制放大Mag和缩小Min模式下分别的过滤模式。

采样过滤模式 解释
Point 使用距离采样点最近的纹素
Bilinear 使用距离最近的 2*2 纹素矩阵的平均值
Trilinear 在双线性过滤的基础上,对 mipmap 层级也进行了平均值过滤

各向异性过滤等级

各向异性过滤技术可以使纹理在倾斜角度下观看会更加清晰。如下图纹理的尽头随着各向异性过滤等级的增加会愈加清晰。但请慎重使用数值越大GPU 的计算量就会越大。

通用设置

设置
mipmap 多级纹理渐变(默认开启)
flipY 翻转 Y 轴(默认关闭)
premultiplyAlpha 预乘透明通道(默认关闭)
format 纹理格式(默认 R8G8B8A8

mipmap

引擎默认开启 mipmap多级纹理渐变mipmap 用来解决从低分辨率屏幕中采样高分辨率纹理时的精度和性能问题,即能在合适的距离时选取不同分辨率的纹理,如下图:

image.png

需要注意的是WebGL2.0 支持任意分辨率的纹理,会根据 mipmap 算法进行一层层的 mip但是如果您的环境是在 WebGL1.0 环境,那么请务必上传2 次幂纹理,如 1024 * 512 这种分辨率的纹理,否则 Galacean 会检测到环境不可使用 mipmap自动降级关闭 mipmap 功能,在视觉上带来一些意外情况。

如果需要改变 mipmap 的默认行为,可以通过脚本来实现,参数详见 API

const texture = new Texture2D(
  engine,
  width,
  height,
  TextureFormat.R8G8B8A8,
  false
); // 第 5 个参数

立方纹理脚本写法,详见 API

const cubeTexture = new TextureCube(
  engine,
  size,
  TextureFormat.R8G8B8A8,
  false
); // 第 4 个参数

flipY

flipY 用来控制纹理是否翻转 Y 轴,即上下颠倒,引擎和编辑器默认关闭,如果需要改变 flipY 的默认行为,可以通过 setImageSource 方法来实现:

const texture = new Texture2D(engine, width, height);
texture.setImageSource(img, 0, true); // 第 3 个参数

premultiplyAlpha

premultiplyAlpha 用来控制纹理是否预乘 alpha(透明) 通道,引擎和编辑器默认关闭,如果需要改变 premultiplyAlpha 的默认行为,可以通过 setImageSource 方法来实现:

const texture = new Texture2D(engine, width, height);
texture.setImageSource(img, 0, undefined, true); // 第 4 个参数

format

引擎默认使用 TextureFormat.R8G8B8A8 作为纹理格式, 即红蓝绿、透明通道分别使用 1 个字节,每个通道允许保存 【0 255】 大小的颜色值。引擎支持配置不同的纹理格式,具体可以参考 TextureFormat。比如我们不需要使用透明通道,即 A 通道,那么我们可以使用 TextureFormat.R8G8B8

const texture = new Texture2D(engine, width, height, TextureFormat.R8G8B8);