图形学常识 | RVT和图像处理

目录

[Runtime virtual texture 实时虚拟纹理RVT](#Runtime virtual texture 实时虚拟纹理RVT)

RVT应用1:

[引擎中开启Virtual Texture support](#引擎中开启Virtual Texture support)

[vLevel = floor[F d(uv)/dx, d(uv)/dy) +Random(-0.25,0.25)]](#vLevel = floor[F d(uv)/dx, d(uv)/dy) +Random(-0.25,0.25)])

RVT的应用2

svt和rvt的区别

双线性过滤和三线性过滤的区别

UE的PixelNormalWS节点

数字图像处理

NPR图像色深

选择合适的色深

应用:做NPR的时候在PS里调贴图的颜色信息,可以把图像模式从8位改成更高位数以获得更丰富的灰度信息

颜色编码


Runtime virtual texture 实时虚拟纹理RVT

Why:虚拟纹理 之所以被称为"虚拟",是因为它并不像传统纹理那样完整地加载到显存中,而是按需加载的。虚拟纹理系统会将一张大纹理(例如用于超大场景的纹理地图)分割成小块(称为"页"),根据视角和需求动态加载和卸载这些小块,仅渲染当前视野中需要的部分。

RVT应用1:

虚拟纹理可以处理场景物体和地面的自然衔接

RVT的应用2:

贴着表面流动的物体/附着地表的草

例图源虚幻引擎官方第18期 | Virtual Texture(虚拟纹理)的理解和应用(Grass贴地工程文件)

VT

What:

虚拟纹理是一种资源管理技术,主要用于减少大规模纹理资源(例如超高分辨率纹理或大型开放世界场景纹理)对显存的占用。在传统纹理处理中,如果场景需要加载多个高分辨率纹理,可能会快速耗尽显存资源。而虚拟纹理可以分割纹理资源,只把当前帧可见范围内的纹理数据加载到显存里,而非整张纹理图。

这种技术通常使用"按需加载"机制:把纹理拆散成一个个tile(上图灰色部分)打散,放在物理内存中的不同位置(图右下角),并根据当前相机位置决定哪些页面需要加载,避免了显存的过度消耗。虚拟纹理系统在后台动态地管理这些页面,类似于一种纹理的"流式传输",让开发者在不损失视觉质量的情况下使用超高分辨率纹理。

How:

引擎中开启Virtual Texture support

采样方式

(mip之间的过渡)

传统纹理采样是通过硬件支持的,是通过硬件处理两个mip之间的差值返回给mip

虚拟纹理采样只能通过shader的修改,把两个数据都采样出来,然后在shader里做lerp就需要两倍的物理内存采样开销。tricky的方法,在实际的采样数值上加二维的偏移(有一些帧采样mip2,有一些帧采样mip3),然后再通过TAA(时域抗锯齿)把mip2 mip3混合到一起,从而达到三线性效果。

vLevel = floor[F d(uv)/dx, d(uv)/dy) +Random(-0.25,0.25)]

表达式的分解

  1. vLevel = floor[...]vLevel表示生成的层级值,这个值取整(向下取整),确保选择的是一个特定的整数层级。

  2. d(uv)/dx, d(uv)/dyd(uv)/dxd(uv)/dy是关于UV坐标的偏导数,表示当前片元(像素)在X和Y方向上UV坐标的变化率。在纹理采样中,这些偏导数通常用于估算片元在不同区域内的细节变化情况。较大的UV变化率通常意味着需要较低的MIP层级(即较模糊的纹理),而较小的变化率可能意味着需要更高的MIP层级(即更清晰的纹理)。

  3. Random(-0.25, 0.25)Random(-0.25, 0.25)是一个在-0.25到0.25之间的随机值,用于添加一定的随机噪声,避免纹理层级选择过于规则。这种噪声通常用于消除因采样而出现的视觉伪影(如莫尔条纹)。

  4. floor[...] :整个表达式的结果通过floor函数向下取整,以获得一个离散的层级值。这样可以用这个值来选择特定的MIP纹理层级。

各向异性

低分辨率Mip缺失

使用LOD避免在远处

svt和rvt的区别

  • SVT (Streaming Virtual Texturing):按需加载和显示大面积纹理,节省内存,提高渲染效率。

  • RVT (Runtime Virtual Texturing):将纹理在运行时动态烘焙到虚拟纹理,适合实时变化的效果,如动态光影。

虚幻引擎在实现虚拟纹理的分类

双线性过滤和三线性过滤的区别

  • 双线性过滤:对纹理的四个相邻像素进行插值,使纹理在放大或缩小时更平滑。

  • 三线性过滤:在双线性过滤基础上,增加不同 mip map 层级之间的插值,使纹理在切换 mip map 时更平滑。

UE的PixelNormalWS节点

如果将 PixelNormalWS 节点直接连接到 Base Color,它会将像素法线的世界空间方向数据直接输出为颜色。由于法线数据是一个向量(包含 x、y、z 分量),引擎会将这些分量映射为 RGB 颜色值。具体效果如下:

  1. 红色通道:表示法线的 X 分量(水平方向)。
  2. 绿色通道:表示法线的 Y 分量(垂直方向)。
  3. 蓝色通道:表示法线的 Z 分量(垂直深度方向)。

这种映射会呈现一种基于像素法线方向的彩色图案。图像会显示不同的颜色,视角变化时颜色也会相应变化,这是因为每个像素的法线方向在世界空间中不同。

数字图像处理

NPR图像色深

在图像处理中,8位、16位、32位模式指的是每个颜色通道使用的比特数,即图像的色深(bit depth)。色深影响图像的色彩范围和细节表现力:

  1. 8位图像:每个颜色通道使用 8 位(即 1 字节),因此单通道的色彩范围为 0-255(总共 256 种灰度)。如果是 RGB 图像,总共有 256×256×256=16,777,216256 \times 256 \times 256 = 16,777,216256×256×256=16,777,216 种颜色(约 1670 万色)。8位图像色彩范围适中,文件较小,适用于大部分网页和常见的应用场景。

  2. 16位图像:每个颜色通道使用 16 位(2 字节),色彩范围为 0-65535,总共支持约 281 万亿种颜色。16位图像可以记录更多细节与颜色过渡,适用于需要高质量色彩表现的图像处理、打印或专业摄影。

  3. 32位图像:每个颜色通道使用 32 位(4 字节),总色彩数极高(约为 3400 万亿亿种)。32 位图像通常用于高动态范围图像(HDR)和科学图像处理,能够保存极细腻的亮度和颜色信息,但文件体积非常大。

选择合适的色深

  • 8位:适合快速查看、网页和一般应用。
  • 16位:适合专业编辑、打印、精细的色彩调整。
  • 32位:适合HDR效果、高精度科学图像。

应用:做NPR的时候在PS里调贴图的颜色信息,可以把图像模式从8位改成更高位数以获得更丰富的灰度信息

颜色编码

YCoCg Base Color是一种颜色编码方式,在解码时将YCoCg转换回常见的RGB颜色空间,从而在游戏或实时渲染中更高效地应用纹理。

YCoCg色彩空间将图像的颜色信息分解为亮度(Y)和两种色差分量(Co红和绿色之间的差异和Cg蓝和绿色之间的差异),可以实现更高的压缩效率,同时保留较好的视觉质量。


[中文直播]第18期 | Virtual Texture(虚拟纹理)的理解和应用 | Epic 李文磊_哔哩哔哩_bilibili

【UE5教程】虚拟纹理使用技巧【附RVT材质函数下载】_哔哩哔哩_bilibili

Unreal Engine 5 Landscape Material - UE5 Tutorial

[UnrealCircle深圳]深入虚拟纹理 | Epic 李杨珂_哔哩哔哩_bilibili

相关推荐
努力长头发的程序猿17 小时前
Unity使用ScriptableObject序列化资源
unity·游戏引擎
mxwin17 小时前
Unity Shader 手写基于 PBR 的 URP Lit Shader 核心光照计算
unity·游戏引擎·shader
魔士于安17 小时前
Unity windows 同步 异步 打开文件文件夹工具
游戏·unity·游戏引擎·贴图·模型
笑虾18 小时前
cocos2d-x lua 加载 Cocos Studio 导出的 csb
游戏引擎·lua·cocos2d
魔士于安18 小时前
unity lowpoly 风格 城市 建筑 道路 交通标志
游戏·unity·游戏引擎·贴图·模型
mxwin18 小时前
Unity GPU Shader 性能优化指南
unity·游戏引擎·shader
董董女友1 天前
unity mcp 配置指南
unity·游戏引擎
垂葛酒肝汤1 天前
Unity的可视化网格和文字标签
unity·游戏引擎
魔士于安1 天前
Unity UI图片 复活节UI,卡通风格
游戏·ui·unity·游戏引擎·材质·贴图
weixin_423995001 天前
unity 团结开发小游戏,加载AssetBundles(第二种方法)
unity·游戏引擎