【URP】Unity[视差贴图]原理剖析实践
【从UnityURP开始探索游戏渲染】专栏-直达
Unity URP 视差贴图介绍与分类
视差贴图(Parallax Mapping)是一种通过动态偏移纹理坐标来模拟表面凹凸效果的渲染技术,主要用于增强低多边形模型的细节表现。在Unity URP(Universal Render Pipeline)中,它通过高度图(Height Map)和视角方向计算UV偏移,实现更真实的深度感,而无需增加模型顶点数量。
视差贴图的核心分类
标准视差贴图(Parallax Mapping)
- 原理:基于单次高度采样计算UV偏移,性能消耗低但效果有限,适合移动端或性能敏感场景。
- 实现:通过高度图的灰度值(黑色为低点,白色为高点)和视角方向,在切线空间内偏移UV坐标,模拟遮挡效果。
- 示例:URP中通过
ParallaxOffset1Step函数实现单步偏移计算。关键参数
_HeightMap:存储高度信息的纹理(R通道)_Parallax:控制凹凸强度的缩放系数(建议0.02-0.05)
切线空间转换
- 使用URP内置函数
GetVertexNormalInputs构建TBN矩阵,将视角方向转换到切线空间
- 使用URP内置函数
性能优化
- 单步偏移计算(
ParallaxOffset)相比多步光线步进(如POM)性能更高,适合移动端
- 单步偏移计算(
ParallaxLit.shader
Shader "Universal Render Pipeline/ParallaxLit"
{
Properties
{
_MainTex("Albedo", 2D) = "white" {}
_NormalMap("Normal Map", 2D) = "bump" {}
_HeightMap("Height Map", 2D) = "white" {}
_Parallax("Height Scale", Range(0, 0.1)) = 0.02
} SubShader
{
Tags { "RenderPipeline"="UniversalPipeline" } HLSLINCLUDE
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" TEXTURE2D(_MainTex); SAMPLER(sampler_MainTex);
TEXTURE2D(_NormalMap); SAMPLER(sampler_NormalMap);
TEXTURE2D(_HeightMap); SAMPLER(sampler_HeightMap);
float _Parallax; float2 ParallaxOffset(float3 viewDirTS, float height)
{
height = height * _Parallax - _Parallax * 0.5;
return height * (viewDirTS.xy / (viewDirTS.z + 0.42));
}
ENDHLSL Pass
{
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag struct Attributes
{
float4 positionOS : POSITION;
float2 uv : TEXCOORD0;
float3 normalOS : NORMAL;
float4 tangentOS : TANGENT;
}; struct Varyings
{
float4 positionCS : SV_POSITION;
float2 uv : TEXCOORD0;
float3 viewDirTS : TEXCOORD1;
}; Varyings vert(Attributes IN)
{
Varyings OUT;
VertexPositionInputs posInput = GetVertexPositionInputs(IN.positionOS.xyz);
OUT.positionCS = posInput.positionCS; // 计算切线空间视角方向
VertexNormalInputs normInput = GetVertexNormalInputs(IN.normalOS, IN.tangentOS);
float3 viewDirWS = GetWorldSpaceViewDir(posInput.positionWS);
OUT.viewDirTS = TransformWorldToTangent(viewDirWS, normInput.tangentWS, normInput.bitangentWS, normInput.normalWS); OUT.uv = IN.uv;
return OUT;
} half4 frag(Varyings IN) : SV_Target
{
// 采样高度图并计算UV偏移
float height = SAMPLE_TEXTURE2D(_HeightMap, sampler_HeightMap, IN.uv).r;
float2 offset = ParallaxOffset(normalize(IN.viewDirTS), height); // 应用偏移后采样纹理
float2 parallaxUV = IN.uv + offset;
half4 albedo = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, parallaxUV);
half3 normalTS = UnpackNormal(SAMPLE_TEXTURE2D(_NormalMap, sampler_NormalMap, parallaxUV)); return half4(albedo.rgb, 1);
}
ENDHLSL
}
}
}
陡峭视差贴图(Steep Parallax Mapping)
- 特点:针对陡峭地形优化,通过多次采样(如二分法)减少失真,适合高落差表面(如岩石、冰缝)。
- 实现:在URP中结合光线步进(Raymarching)算法,逐层检测高度图以确定最终UV偏移。
视差遮挡贴图(Parallax Occlusion Mapping, POM)
- 优势:在标准视差基础上增加遮挡计算,通过多次采样模拟更精确的深度感,但性能开销较高。
- 应用:常用于风格化材质(如风化岩石、冰面裂缝),需配合高度图和法线贴图使用。
技术实现细节
核心原理
- 高度图采样
- 使用灰度图(通常存储在法线贴图的Alpha通道)表示表面深度,黑色(0)为最低点,白色(1)为最高点。
- 切线空间转换
- 将视角方向从世界空间转换到切线空间(通过TBN矩阵),确保偏移方向与模型表面法线对齐。
- UV偏移计算
- 根据高度值和视角方向动态调整UV坐标,核心公式为 $offset=\frac{height \cdot viewDir_{xy}}{viewDir_z}$
- 其中
viewDir需归一化,且需避免除零(通常添加小偏移量如viewDir.z + 0.42)
URP中的Shader实现
核心函数:
ParallaxOffset1Step(单步偏移)或自定义光线步进算法。示例代码(HLSL):
hlsl
float2 ParallaxOffset(half3 viewDirTS, half height, half scale) {
return height * (viewDirTS.xy / viewDirTS.z) * scale;
}
性能优化
- 使用
_Parallax参数控制强度,避免过度偏移导致穿帮。 - 移动端建议采用标准视差贴图,PC端可尝试POM。
与其他贴图技术的对比
| 技术 | 原理差异 | 性能开销 | 适用场景 | 优势 | 局限性 |
|---|---|---|---|---|---|
| 法线贴图 | 仅改变光照计算 | 低 | 通用细节增强 | 性能最优 | 平视视角易穿帮 |
| 视差贴图 | 动态UV偏移模拟深度 | 中 | 风格化材质、地形 | 真实遮挡效果 | 陡峭边缘可能失真 |
| 置换贴图 | 实际修改顶点位置 | 高 | 高精度模型(如地形) | 几何级精度 | 需要曲面细分支持 |
总结
视差贴图在URP中通过动态UV偏移和高度图采样,有效平衡了性能与视觉效果。根据需求选择标准、陡峭或POM变种,可适配不同场景的细节要求
【从UnityURP开始探索游戏渲染】专栏-直达
(欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,)
【URP】Unity[视差贴图]原理剖析实践的更多相关文章
- 深入浅出深度学习:原理剖析与python实践_黄安埠(著) pdf
深入浅出深度学习:原理剖析与python实践 目录: 第1 部分 概要 1 1 绪论 2 1.1 人工智能.机器学习与深度学习的关系 3 1.1.1 人工智能——机器推理 4 1.1.2 机器学习—— ...
- 推荐《深入浅出深度学习原理剖析与python实践》PDF+代码
<深入浅出深度学习原理剖析与Python实践>介绍了深度学习相关的原理与应用,全书共分为三大部分,第一部分主要回顾了深度学习的发展历史,以及Theano的使用:第二部分详细讲解了与深度学习 ...
- Java对象拷贝原理剖析及最佳实践
作者:宁海翔 1 前言 对象拷贝,是我们在开发过程中,绕不开的过程,既存在于Po.Dto.Do.Vo各个表现层数据的转换,也存在于系统交互如序列化.反序列化. Java对象拷贝分为深拷贝和浅拷贝,目前 ...
- 在 OpenGL ES 2.0 上实现视差贴图(Parallax Mapping)
在 OpenGL ES 2.0 上实现视差贴图(Parallax Mapping) 视差贴图 最近一直在研究如何在我的 iPad 2(只支持 OpenGL ES 2.0, 不支持 3.0) 上实现 视 ...
- MapReduce/Hbase进阶提升(原理剖析、实战演练)
什么是MapReduce? MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算.概念"Map(映射)"和"Reduce(归约)",和他们 ...
- 基本功 | Litho的使用及原理剖析
1. 什么是Litho? Litho是Facebook推出的一套高效构建Android UI的声明式框架,主要目的是提升RecyclerView复杂列表的滑动性能和降低内存占用.下面是Litho官网的 ...
- 2018-2019-2 网络对抗技术 20165324 Exp2: 后门原理与实践
2018-2019-2 网络对抗技术 20165324 Exp2: 后门原理与实践 课程学习: 后门 后门:是不经过正常认证流程而访问系统的通道,存在与编译器.操作系统.固件和应用中等等. 后门工作流 ...
- Java 动态调试技术原理及实践
本文转载自Java 动态调试技术原理及实践 导语 断点调试是我们最常使用的调试手段,它可以获取到方法执行过程中的变量信息,并可以观察到方法的执行路径.但断点调试会在断点位置停顿,使得整个应用停止响应. ...
- Atitit 管理原理与实践attilax总结
Atitit 管理原理与实践attilax总结 1. 管理学分类1 2. 我要学的管理学科2 3. 管理学原理2 4. 管理心理学2 5. 现代管理理论与方法2 6. <领导科学与艺术4 7. ...
- 视差贴图(Parallax Mapping)
使用顶点光照的模型,当模型的面数很少的时候,光照效果会显得很奇怪,因为只有顶点上的光照是正确计算出来的,三角面上的光照都是通过硬件插值得到,所以难免会出现问题.基于像素的光照可以很好的改善这个问题.如 ...
随机推荐
- SciTech-Health+Pharmacy-藻酸盐化学物 + 做牙模型的藻酸盐使用注意事项
https://baike.baidu.com/item/藻酸盐/10984767 https://blog.kq88.com/index.php?s=/Headpage/Artshow/index/ ...
- Windows系统下结束nginx进程 --九五小庞
1.使用右键选中nginx进程,结束进程后,一会儿又出来了,重复多次无效,且页面依旧可以访问 2.使用nginx -s stop 命令,报错,无法停止进程 3.使用netstat -ano 查看端口监 ...
- 进阶篇:3.1.3)DFM塑胶-成型不良的原因及调节方法详解
本章目的:作为结构工程师,怎么处理注塑件成型不良的问题. 1.前言 注塑件成型不良是一个结构工程师常常需要面对的问题.很多时候并非设计上有问题,而是制造过程中的问题导致成品的不良.结构工程师了解成型不 ...
- Win10纯净版无法打开图片提示错误的问题
有一位深度系统的win10纯净版用户,在打开一些图片无法正常的显示出来,而是显示了黑色的界面.遇到这个问题我们会无法预览图片的具体内容,影响非常大.那么接下来我们就来看看深度技术小编如何解决这个问题的 ...
- 那些年我们一起追过的Java技术,现在真的别再追了!
大家好,我是晓凡. 一.写在前面 前两天,有粉丝朋友小赵,兴冲冲地问我:"凡哥,我想学JSP,网上教程可便宜了,9块9包邮!" 我当场差点把刚喝下去的冰美式喷到他脸上. " ...
- SGT 进阶(?
动态开点 当正常堆式建树开不下时(\(n\) 或 \(V\) 过大),通常使用动态开点. 例题 P2781 传教 算是很板了吧? 每次修改的时候,若当前访问节点未建立则新建节点并回溯至上一个节点记录左 ...
- MyEMS开源能源管理系统核心代码解读009
本期解读: 虚拟点计算方法:myems/myems-normalization/virtualpoint.py 这段代码是一个用于计算和更新虚拟点(virtual points)值的Python脚本. ...
- 2024 ICPC杭州
The 2024 ICPC Asia Hangzhou Regional Contest 外榜 https://board.xcpcio.com/icpc/49th/hangzhou 铜线: 4题73 ...
- solidity学习之ERC4626
什么是ERC4626 ERC4626是对ERC20代币标准的扩展,用于实现收益金库的标准化,用户可以将资产质押到合约中,持有相应的shares凭证,通过凭证来享有合约后续的收益. 实现逻辑 ERC46 ...
- TFS Webapi软件发布并部署到服务器的一些必需操作
本地主机启动IIS:控制面板--所有控制面板项--管理工具--Internet信息服务(IIS)管理器(双击即可进入详细配置界面)--右击网站--添加网站.如果上一个步骤不能够凑效,则需要" ...