【从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矩阵,将视角方向转换到切线空间
    • 性能优化

      • 单步偏移计算(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[视差贴图]原理剖析实践的更多相关文章

  1. 深入浅出深度学习:原理剖析与python实践_黄安埠(著) pdf

    深入浅出深度学习:原理剖析与python实践 目录: 第1 部分 概要 1 1 绪论 2 1.1 人工智能.机器学习与深度学习的关系 3 1.1.1 人工智能——机器推理 4 1.1.2 机器学习—— ...

  2. 推荐《深入浅出深度学习原理剖析与python实践》PDF+代码

    <深入浅出深度学习原理剖析与Python实践>介绍了深度学习相关的原理与应用,全书共分为三大部分,第一部分主要回顾了深度学习的发展历史,以及Theano的使用:第二部分详细讲解了与深度学习 ...

  3. Java对象拷贝原理剖析及最佳实践

    作者:宁海翔 1 前言 对象拷贝,是我们在开发过程中,绕不开的过程,既存在于Po.Dto.Do.Vo各个表现层数据的转换,也存在于系统交互如序列化.反序列化. Java对象拷贝分为深拷贝和浅拷贝,目前 ...

  4. 在 OpenGL ES 2.0 上实现视差贴图(Parallax Mapping)

    在 OpenGL ES 2.0 上实现视差贴图(Parallax Mapping) 视差贴图 最近一直在研究如何在我的 iPad 2(只支持 OpenGL ES 2.0, 不支持 3.0) 上实现 视 ...

  5. MapReduce/Hbase进阶提升(原理剖析、实战演练)

    什么是MapReduce? MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算.概念"Map(映射)"和"Reduce(归约)",和他们 ...

  6. 基本功 | Litho的使用及原理剖析

    1. 什么是Litho? Litho是Facebook推出的一套高效构建Android UI的声明式框架,主要目的是提升RecyclerView复杂列表的滑动性能和降低内存占用.下面是Litho官网的 ...

  7. 2018-2019-2 网络对抗技术 20165324 Exp2: 后门原理与实践

    2018-2019-2 网络对抗技术 20165324 Exp2: 后门原理与实践 课程学习: 后门 后门:是不经过正常认证流程而访问系统的通道,存在与编译器.操作系统.固件和应用中等等. 后门工作流 ...

  8. Java 动态调试技术原理及实践

    本文转载自Java 动态调试技术原理及实践 导语 断点调试是我们最常使用的调试手段,它可以获取到方法执行过程中的变量信息,并可以观察到方法的执行路径.但断点调试会在断点位置停顿,使得整个应用停止响应. ...

  9. Atitit 管理原理与实践attilax总结

    Atitit 管理原理与实践attilax总结 1. 管理学分类1 2. 我要学的管理学科2 3. 管理学原理2 4. 管理心理学2 5. 现代管理理论与方法2 6. <领导科学与艺术4 7. ...

  10. 视差贴图(Parallax Mapping)

    使用顶点光照的模型,当模型的面数很少的时候,光照效果会显得很奇怪,因为只有顶点上的光照是正确计算出来的,三角面上的光照都是通过硬件插值得到,所以难免会出现问题.基于像素的光照可以很好的改善这个问题.如 ...

随机推荐

  1. SciTech-Health+Pharmacy-藻酸盐化学物 + 做牙模型的藻酸盐使用注意事项

    https://baike.baidu.com/item/藻酸盐/10984767 https://blog.kq88.com/index.php?s=/Headpage/Artshow/index/ ...

  2. Windows系统下结束nginx进程 --九五小庞

    1.使用右键选中nginx进程,结束进程后,一会儿又出来了,重复多次无效,且页面依旧可以访问 2.使用nginx -s stop 命令,报错,无法停止进程 3.使用netstat -ano 查看端口监 ...

  3. 进阶篇:3.1.3)DFM塑胶-成型不良的原因及调节方法详解

    本章目的:作为结构工程师,怎么处理注塑件成型不良的问题. 1.前言 注塑件成型不良是一个结构工程师常常需要面对的问题.很多时候并非设计上有问题,而是制造过程中的问题导致成品的不良.结构工程师了解成型不 ...

  4. Win10纯净版无法打开图片提示错误的问题

    有一位深度系统的win10纯净版用户,在打开一些图片无法正常的显示出来,而是显示了黑色的界面.遇到这个问题我们会无法预览图片的具体内容,影响非常大.那么接下来我们就来看看深度技术小编如何解决这个问题的 ...

  5. 那些年我们一起追过的Java技术,现在真的别再追了!

    大家好,我是晓凡. 一.写在前面 前两天,有粉丝朋友小赵,兴冲冲地问我:"凡哥,我想学JSP,网上教程可便宜了,9块9包邮!" 我当场差点把刚喝下去的冰美式喷到他脸上. " ...

  6. SGT 进阶(?

    动态开点 当正常堆式建树开不下时(\(n\) 或 \(V\) 过大),通常使用动态开点. 例题 P2781 传教 算是很板了吧? 每次修改的时候,若当前访问节点未建立则新建节点并回溯至上一个节点记录左 ...

  7. MyEMS开源能源管理系统核心代码解读009

    本期解读: 虚拟点计算方法:myems/myems-normalization/virtualpoint.py 这段代码是一个用于计算和更新虚拟点(virtual points)值的Python脚本. ...

  8. 2024 ICPC杭州

    The 2024 ICPC Asia Hangzhou Regional Contest 外榜 https://board.xcpcio.com/icpc/49th/hangzhou 铜线: 4题73 ...

  9. solidity学习之ERC4626

    什么是ERC4626 ERC4626是对ERC20代币标准的扩展,用于实现收益金库的标准化,用户可以将资产质押到合约中,持有相应的shares凭证,通过凭证来享有合约后续的收益. 实现逻辑 ERC46 ...

  10. TFS Webapi软件发布并部署到服务器的一些必需操作

    本地主机启动IIS:控制面板--所有控制面板项--管理工具--Internet信息服务(IIS)管理器(双击即可进入详细配置界面)--右击网站--添加网站.如果上一个步骤不能够凑效,则需要" ...