【URP】Unity[RendererFeatures]贴花Decal

news/2025/11/19 8:46:22/文章来源:https://www.cnblogs.com/SmalBox/p/19240477

【从UnityURP开始探索游戏渲染】专栏-直达

Unity URP中的Decal(贴花)系统是一种用于将材质投射到场景几何体表面的技术,主要用于实现血迹、弹孔、涂鸦等动态表面装饰效果。以下是详细解析:

核心功能与用途

  • 动态投影‌:通过Decal Projector组件将材质动态投射到任意表面,包括曲面和复杂几何体
  • 光照交互‌:支持与场景光照系统交互,可模拟阴影、高光等物理效果
  • 典型应用场景‌:
    • 游戏中的弹孔、血迹、涂鸦
    • 环境细节增强(如墙面裂缝、污渍)
    • 技能范围指示器(如Dota2的地面标记)

技术演进

版本阶段 实现方式 特性差异
传统实现 基于面片Mesh 仅支持平面投影,无法适应复杂曲面
URP早期 Projector组件 存在深度冲突(Z-fighting)问题,性能开销大
URP 12+ Decal Renderer Feature 支持PBR材质,与SRP深度集成,性能优化

原理

Unity URP中的Decal系统通过‌深度缓冲重建世界坐标‌和‌材质投影技术‌实现动态贴花效果,其核心原理可分为以下技术层级:


底层渲染流程

  • 深度图采样

    Decal Renderer Feature在渲染管线中插入自定义Pass,通过_CameraDepthTexture获取像素深度值,结合摄像机参数重建世界坐标。关键公式:

    worldPos = _CameraToWorld矩阵 × (屏幕UV + 深度值 × 视锥向量)

  • 投影体积裁剪

    使用Decal Projector定义的立方体边界(Size参数)进行空间裁剪,通过射线与AABB碰撞检测判断像素是否在投影范围内。超出范围的像素会被剔除。

  • 材质混合

    采用‌延迟渲染路径‌的GBuffer修改策略,通过Blend指令将Decal的Albedo/Normal/Metallic等属性与场景材质混合,支持PBR光照交互。


关键代码实现示例

以下为简化版Shader核心逻辑:

hlsl
// 深度重建世界坐标
float3 ReconstructWorldPos(float2 uv, float depth) {float4 clipPos = float4(uv * 2 - 1, depth, 1);float4 worldPos = mul(_ClipToWorld, clipPos);return worldPos.xyz / worldPos.w;
}// 投影体积判断
bool IsInDecalVolume(float3 worldPos, float3 decalPos, float3 size) {float3 localPos = mul(_WorldToDecal, float4(worldPos, 1)).xyz;return all(abs(localPos) < 0.5);
}

技术演进对比

版本 技术方案 缺陷 改进点
传统实现 基于Mesh面片投影 无法适应曲面 -
URP 10 屏幕空间深度采样 透明物体不支持 减少Z-fighting
URP 12+ GBuffer混合+体积裁剪 性能开销较高 支持PBR和动态光照

性能优化要点

  • 层级剔除‌:通过Decal Layer分类控制不同Decal的渲染层级
  • 距离淡出‌:Draw DistanceStart Fade参数动态减少远处Decal计算
  • 批处理‌:相同材质的Decal Projector会自动合并绘制调用

典型问题解决方案

  • 透明物体支持‌:需自定义Shader重写AlphaTest逻辑
  • 曲面变形‌:增加Normal Smoothing参数修正法线插值
  • 移动端适配‌:降低深度图精度或使用Depth Prepass策略

完整实现流程

  • 创建URP Asset:
    • 菜单栏 Edit > Project Settings > Graphics
    • 指定URP Pipeline Asset
  • 添加Decal Renderer Feature:
    • 在URP Renderer Data中添加Decal Renderer Feature
    • 设置Priority控制渲染顺序
  • 创建Decal材质:
    • Shader选择"Universal Render Pipeline/Decal"
    • 配置Albedo、Normal等贴图通道
  • 放置Decal Projector:
    • 创建空GameObject
    • 添加Decal Projector组件
    • 关联步骤创建的材质

关键参数详解

参数 类型 作用 典型值
Size Vector3 控制投影体积尺寸 (2,2,2)
Fade Factor Float [0-1] 边缘渐变强度 0.8
Draw Distance Float 渲染距离阈值 20
Start Fade Float 开始淡出的距离 15
Angle Fade Vector2 基于表面角度的淡出 (0.5,0.8)
Affects Transparent Bool 是否影响透明表面 False

案例:弹孔效果

  • 材质准备‌:

    • 使用8K扫描的弹孔贴图(Quixel Megascans)
    • 法线贴图增强立体感
  • 动态生成‌:

    csharp
    void CreateBulletHole(Vector3 hitPoint, Vector3 normal) {var decal = new GameObject("BulletHole");var projector = decal.AddComponent<DecalProjector>();projector.material = bulletHoleMaterial;decal.transform.position = hitPoint + normal * 0.1f;decal.transform.rotation = Quaternion.LookRotation(-normal);
    }
    
  • 性能优化‌:

    • 使用对象池管理Decal实例
    • 设置合理的Draw Distance避免过度渲染

注意事项

  • 深度冲突‌:适当调整Projector的Offset参数(建议0.05-0.1)
  • 移动平台‌:需测试ES3.0设备兼容性,必要时降低贴图分辨率
  • 透明表面‌:默认不支持透明物体接收Decal,需特殊Shader处理

【从UnityURP开始探索游戏渲染】专栏-直达
(欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,🙏)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/969624.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年评价高的编织纸绳热门厂家推荐榜单

2025年评价高的编织纸绳热门厂家推荐榜单 行业背景与市场趋势 随着全球环保意识的提升,纸绳作为传统塑料绳的绿色替代品,市场需求持续增长。根据《2024年全球纸制品市场分析报告》,纸绳市场规模预计在2025年达到2…

2025年口碑好的拉菲草纸绳TOP品牌厂家排行榜

2025年口碑好的拉菲草纸绳TOP品牌厂家排行榜行业背景与市场趋势随着全球环保意识的不断提升和可持续发展理念的深入人心,环保包装材料市场迎来了前所未有的发展机遇。据《2024-2029年全球环保包装材料市场分析报告》显…

信竞生家长必须要了解的几个网站

信竞生家长必须要了解的几个网站信竞生家长必须要了解的几个网站:https://www.noi.cn/,NOI 官网, 用于了解各省和全国的官方信竞政策、查询各种信息,包括所有选手的获奖信息。 https://oier.baoshuo.dev/,oierdb收录…

2025年口碑好的木螺丝最新TOP厂家排名

2025年口碑好的木螺丝最新TOP厂家排名行业背景与市场趋势随着全球建筑和家居装饰行业的持续发展,木螺丝作为基础紧固件市场需求稳步增长。据中国五金制品协会2024年数据显示,全球木螺丝市场规模已达到78亿美元,预计…

【JUnit实战3_05】第二章:探索 JUnit 的核心功能(四) - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年比较好的手拧螺丝用户好评厂家排行

2025年比较好的手拧螺丝用户好评厂家排行行业背景与市场趋势手拧螺丝作为五金紧固件中的重要品类,在电子设备、家用电器、汽车制造、新能源等领域有着广泛应用。根据中国五金制品协会最新发布的《2024-2025中国紧固件…

2025年知名的网红小火车厂家最新权威推荐排行榜

2025年知名的网红小火车厂家最新权威推荐排行榜行业背景与市场趋势随着文旅产业的蓬勃发展,观光小火车作为景区特色交通工具和网红打卡项目,市场需求持续增长。据中国旅游装备协会最新数据显示,2024年我国观光小火车…

DataGrip2025.2.4 11月最新版 安装、授权、使用说明

DataGrip2025.2.4 11月最新版 安装、授权、使用说明2025-11-19亲测 支持最新版本2025.2.4 支持Windows、MAC、Linux一 安装 官网下载 : https://www.jetbrains.com/zh-cn/datagrip/ 根据提示安装 二 授权说明回复 《D…

linux c开发工具

在 Linux 系统中,C 语言开发工具和环境是开发高性能应用的重要组成部分。以下是一些常用的 C 开发工具和环境,适用于大多数 Linux 发行版(如 Ubuntu、Debian、CentOS、Fedora 等):一、C 编译器(编译器工具链) 1…

2025年比较好的网红小火车厂家最新TOP实力排行

2025年比较好的网红小火车厂家最新TOP实力排行行业背景与市场趋势随着文旅产业的蓬勃发展,网红小火车作为景区特色交通工具和打卡项目,市场需求持续增长。据《2024-2025年中国旅游装备制造业发展报告》显示,2024年我…

2025年如何高效安全地在软件外包强大的平台上接单

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年评价高的云桌面系统代理商哪家强

2025年云桌面系统代理商推荐:北京拓实科技有限公司专业实力获得市场认可北京拓实科技有限公司作为业内领先的IT基础设施服务商,在云桌面系统代理领域具有显著优势。公司自2002年成立以来,深耕企业信息化建设23年,积…

2025年评价高的景区轨道观光小火车热门厂家推荐榜单

2025年评价高的景区轨道观光小火车热门厂家推荐榜单行业背景与市场趋势随着国内旅游业的蓬勃发展,景区配套设施升级成为提升游客体验的重要环节。轨道观光小火车作为景区交通与游览体验的双重载体,近年来市场需求持续…

2025年评价高的成都活动房厕所市场热度榜

2025年评价高的成都活动房厕所市场热度榜 行业背景与市场趋势 近年来,随着城市化进程加快、临时建筑需求激增以及环保政策的推动,活动房厕所市场在成都及周边地区呈现显著增长。据《2024年中国集成房屋行业报告》显…

2025年知名的乳化液过滤机TOP品牌厂家排行榜

2025年知名的乳化液过滤机TOP品牌厂家排行榜行业背景与市场趋势乳化液过滤机作为工业制造领域的关键设备,在金属加工、汽车制造、航空航天等行业中扮演着不可或缺的角色。随着中国制造业向高质量发展转型,乳化液过滤…

2025年靠谱的成都二手活动房本地优选榜

2025年靠谱的成都二手活动房本地优选榜行业背景与市场趋势随着城市化进程加速和建筑行业转型升级,成都二手活动房市场近年来呈现稳定增长态势。据中国建筑金属结构协会2024年发布的《中国装配式建筑行业发展报告》显示…

宝塔更换默认PHP版本

查看当前php版本ls -l /usr/bin/php 更换版本ln -sf /www/server/php/80/bin/php /usr/bin/php

完整教程:发刊词:开启你的高效决策之旅(专栏目录)

完整教程:发刊词:开启你的高效决策之旅(专栏目录)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&qu…

linux c守护进程

在 Linux 中,守护进程(Daemon)是指在后台运行、不与用户交互的进程。它们通常通过 systemd、init(如 SysVinit)或 supervisord 等系统服务管理。 下面我将从 原理、创建方式、管理方式 和 常用工具 四个方面来解释…

linux c启动进程

在 Linux 中,启动一个 C 程序(即编译并运行一个 C 程序)通常涉及以下几个步骤:? 一、编译 C 程序 使用 gcc 编译器编译 .c 文件: gcc -o myprogram myprogram.c-o myprogram:指定输出文件名(如 myprogram)。 …