Unity中的投影系统主要包括传统Projector组件和URP Decal Projector两种实现方式。

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

发展历史与技术演进

  • 传统Projector组件:Unity早期内置的通用投影系统,通过摄像机空间矩阵计算实现材质投影,但存在性能开销大、与URP管线兼容性差的问题
  • URP Decal Projector:自URP 12(Unity 2021)引入的专用贴花系统,采用延迟渲染路径和屏幕空间计算,性能优化显著

核心实现原理

传统Projector:

  • 继承自Behaviour的UnityEngine.Projector类实现
  • 基于视锥体裁剪和投影矩阵变换
  • 通过MaterialPropertyBlock动态修改着色器参数

URP Decal Projector:

  • 使用DecalRendererFeature扩展URP管线
  • 采用Deferred Decals技术,在GBuffer阶段后处理
  • 通过DecalProjector组件管理投影参数
  • Projector组件的工作只是检测了所有范围内的模型,并传递了投影空间矩阵。
  • 投影着色器,用这个投影矩阵,左乘齐次裁剪空间的点,得到的坐标作为uv坐标传递给片元着色器。
  • 片元着色器中使用tex2Dproj(_MainTex, i.texc)获取实际纹理。这里的tex2Dproj实际上是将 $i.texc = i.texc/i.texc.w$ 透视除法
  • tex2D(_MainTex, i.texc) 获取纹理文素

实际应用对比

传统Projector示例:

csharp
// 动态调整投影参数
Projector proj = GetComponent<Projector>();
proj.nearClipPlane = 0.5f;
proj.material.SetFloat("_Falloff", 0.8f);

URP Decal Projector工作流:

  • 创建Decal Material:使用Shader Graphs/Decal着色器
  • 配置Decal Projector:调整Size/Depth等参数
  • 通过脚本动态生成:
csharp
// 在碰撞点生成弹孔
DecalProjector CreateBulletHole(Vector3 position) {
GameObject decal = Instantiate(decalPrefab, position, Quaternion.LookRotation(-hit.normal));
return decal.GetComponent<DecalProjector>();

实践

典型应用场景:

URP Decal Projector基础配置

  • 环境准备:

    • 创建URP Asset并配置到Graphics Settings
    • 通过Package Manager安装Universal RP 12.1.6+版本
  • 核心组件添加:
csharp
// 添加Decal Renderer Feature
var renderer = URP资产中的Renderer数据;
renderer.AddFeature(new DecalRendererFeature());

环境细节:墙面涂鸦、地面污渍(URP Decal)

  • 墙面涂鸦实现:

    • 创建Decal Material:使用Shader Graphs/Decal着色器,配置Albedo贴图为涂鸦图案
    • 调整Projector参数:Size=(2,2,0.5), Fade Factor=0.8
    • 层过滤:设置Affected Layers仅包含Wall层
  • 地面污渍效果:
    • 材质配置:混合Albedo(污渍贴图)和Normal Map(凹凸细节)

    • 投影参数:Depth=0.3, Angle Fade=(0.8,1.0)

    • 动态生成代码:

      csharp
      void CreateMudDecal(Vector3 position) {
      var decal = Instantiate(decalPrefab);
      decal.transform.position = position + Vector3.up*0.1f;
      decal.GetComponent<DecalProjector>().size =
      new Vector3(Random.Range(0.5f,1.5f), 0.2f, Random.Range(0.5f,1.5f));
      }

动态效果:弹孔、血迹(两种方案均可)

  • 弹孔效果高级实现:

    • 预制体配置:包含Decal Projector和Particle System

    • 命中点生成逻辑:

      csharp
      void CreateBulletHole(RaycastHit hit) {
      var decal = Instantiate(bulletHolePrefab,
      hit.point + hit.normal*0.01f,
      Quaternion.LookRotation(-hit.normal));
      decal.transform.Rotate(Vector3.forward, Random.Range(0,360));
      Destroy(decal, 10f);// 10秒后自动消失
      }
  • 血迹效果优化方案:

    • 材质混合:使用Multiply混合模式增强真实感

    • 动态渐隐控制:

      csharp
      IEnumerator FadeDecal(DecalProjector decal, float duration) {
      float startTime = Time.time;
      while(Time.time < startTime + duration) {
      float t = (Time.time - startTime) / duration;
      decal.fadeFactor = Mathf.Lerp(1, 0, t);
      yield return null;
      }
      Destroy(decal.gameObject);
      }
  • 特殊光照:投影阴影(传统Projector)

性能优化:

  • 传统Projector:限制影响范围,使用简单材质
  • URP Decal:
    • 启用Layer Mask过滤,控制Fade Distance
    • 批处理设置:对静态Decal启用Batching
    • 视锥体裁剪:调整Projector的Far Clip Plane避免过度绘制
    • 动态控制:非可见区域暂停Decal更新
    • 材质复用:相同类型效果共享材质实例
    • 实际项目建议采用分层管理系统,对不同类型Decal进行分类管理,例如:
      • 永久性Decal(涂鸦):使用单独Layer并启用Occlusion Culling
      • 临时性Decal(弹孔):使用对象池技术减少实例化开销
      • 环境Decal(污渍):烘焙到Lightmap中减少运行时消耗

参数配置要点:

  • 投影角度:通过旋转控制投影方向
  • 衰减控制:使用Falloff参数平滑边缘
  • 混合模式:Alpha Blend/Multiply选择

当前URP项目推荐优先使用Decal Projector系统,其性能表现和视觉效果更优,特别是在需要大量动态贴花的场景中。传统Projector仍适用于需要实时阴影投影等特殊需求场景.


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

(欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,)

【URP】[投影Projector]解析与应用的更多相关文章

  1. threejs三维地图大屏项目分享

    这是最近公司的一个项目.客户的需求是基于总公司和子公司的数据,开发一个数据展示大屏. 大屏两边都是一些图表展示数据,中间部分是一个三维中国地图,点击中国地图的某个省份,可以下钻到省份地图的展示. 地图 ...

  2. Gis数据处理

    几何投影和解析投影几何投影是将椭球面上的经纬线网投影到几何平面上,然后将几何面展为平面.几何投影可以分为方位投影.圆柱投影和圆锥投影.这三种投影纬线的形状不同.方位投影纬线的形状是同心圆:圆柱投影纬线 ...

  3. Unity3D手游开发日记(1) - 移动平台实时阴影方案

    阴影这个东西,说来就话长了,很多年前人们就开始研究出各种阴影技术,但都存在各种瑕疵和问题,直到近几年出现了PSSM,也就是CE3的CSM,阴影技术才算有个比较完美的解决方案.Unity自带的实时阴影, ...

  4. Trident中的解析包含的函数操作与投影操作

    一:函数操作 1.介绍 Tuple本身是不可变的 Function只是在原有的基础上追加新的tuple 2.说明 如果原来的字段是log,flag 新增之后的tuple可以访问这些字段,log,fla ...

  5. 使用QT开发GoogleMap瓦片显示和下载工具(2)——Google地图瓦片投影和获取网址解析

    这篇主要说的是Google地图采用的投影方式,瓦片划分方式以及如何从给定的经纬度获取瓦片的数据的网址.所有资料均来自于网络,并亲自试验可行. Google地图投影 首先是地图投影问题,因为地球本身是一 ...

  6. PL-SVO公式推导及代码解析:地图点重投影和特征对齐

    对当前帧进行地图点重投影和特征对齐 // map reprojection & feature alignment SVO_START_TIMER("reproject") ...

  7. SVO原理解析

    最近空闲时间在研究Semi-Direct Monocular Visual Odometry(SVO)[1,2],觉得它值得写一写.另外,SVO的运算量相对较小,我想在手机上尝试实现它. 关于SVO的 ...

  8. [CG编程] 基本光照模型的实现与拓展以及常见光照模型解析

    0.前言 这篇文章写于去年的暑假.大二的假期时间多,小组便开发一个手机游戏的项目,开发过程中忙里偷闲地了解了Unity的shader编写,而CG又与shaderLab相似,所以又阅读了<CG教程 ...

  9. Google Maps地图投影全解析(3):WKT形式表示

    update20090601:EPSG对该投影的编号设定为EPSG:3857,对应的WKT也发生了变化,下文不再修改,相对来说格式都是那样,可以到http://www.epsg-registry.or ...

  10. Spark之SQL解析(源码阅读十)

    如何能更好的运用与监控sparkSQL?或许我们改更深层次的了解它深层次的原理是什么.之前总结的已经写了传统数据库与Spark的sql解析之间的差别.那么我们下来直切主题~ 如今的Spark已经支持多 ...

随机推荐

  1. STL:迭代器与常用算法

    迭代器 C++ STL(Standard Template Library,标准模板库)中迭代器与常用算法是泛型编程的核心组成部分.它们配合使用,可以对容器进行高效.统一的操作.下面是对它们的系统性总 ...

  2. 在使用Flink CDC时,源表没有主键如何处理

    本文分享自天翼云开发者社区<在使用Flink CDC时,源表没有主键如何处理>,作者:5****m 在Flink CDC中,当源表没有主键时,需要设置scan.incremental.sn ...

  3. idea部分操作(一)----持续更新

    07:51:101.IDEA正确设置编码统一为UTF-8: 这样可以整体修改.

  4. 解决Chrome打印对话框中没有布局设置横向问题

    本文方法来源于stackoverflow: https://stackoverflow.com/questions/36322109/chrome-printing-website-missing-l ...

  5. github action的使用

    近年来,我一直在使用jenkins 来部署自己的项目,发现太耗内存了, 因此将自动化部迁的操作改为使用github action. 初始化action配置 选择一个合适的action类型,比如webp ...

  6. 论文中关于要使用600线的python代码

    简介 论文中通常要使用600dpi的图片, 如果一个一个用PS来进行修改实在是费力不讨好. 使用python一套带走 code import os from PIL import Image impo ...

  7. C++ basic_string::_M_construct null not valid

    这个错误我在构造函数中爆出了错误 累坏我了 一般来说是赋值了不该赋的值 string 类型的初始化 用 int 结果炸了

  8. 瑞友天翼应用虚拟化系统RCE漏洞

    查看版本 /RAPAgent.XGI?CMD=GetRegInfo 构造数据包造写入木马 POST /AgentBoard.XGI?cmd=UserLogin HTTP/1.1 Host: User- ...

  9. iPaaS中API自动化测试的作用

    在iPaaS中,API自动化测试的作用主要是有助于验证集成流程的正确性.保证数据一致性.监控和故障排除.性能评估.支持持续集成和持续交付,并增加合作和安全性.通过自动化测试,可以提高iPaaS平台的稳 ...

  10. 全球人口数量、共享单车GPS轨迹、地铁上下客流数据获取平台分享

      本文对目前主要的人口数量与密度.共享单车GPS轨迹.地铁人流与轨迹等数据产品的获取网站加以整理与介绍. 目录 7 人口.共享单车与地铁数据 7.1 人口数据 7.1.1 WorldPop 7.1. ...