1 前言

镜面反射(Planar reflection)是游戏中比较常用的效果,例如角色的展示界面的地面倒影,物体在水面的倒影,光滑的表面等。

1.1 利用反射摄像机实现镜面反射

在URP中常规的镜面反射一般使用镜头方案来实现,也就是创造一个反射镜头,按照反射平面的位置翻转镜头,渲染一遍反射物体到RT,在绘制水面的时候,采样这个RT进行着色。

1.2 利用SSR实现镜面反射

SSR目前在URP中一般使用步进或compute shader来进行实现,步进的性能在移动端基本无法接受。而compute shader存在一定兼容性问题,需要配合例如vulkan之类的现代图形api才能获得较好的效果。

1.3 利用一个render object pass来实现镜面反射

相对于前两种方案而言,这个方案更为简单,相比镜头方案也有更好的性能,易于理解,本文主要分析这个方案,探讨一下该方案的实现。

2 Render Feature实现镜面反射

我们知道镜头方案的反射是通过翻转摄像机得到的,那么利用相同的思路我们也可以通过翻转要反射的物体来实现镜面反射。

在一开始实现这个render feature之前,也尝试了直接翻转镜头来实现,也就是在画反射平面之前,翻转一次镜头,绘制要反射的物体,再恢复摄像机原来的transform正常绘制其他物体和反射平面。但在URP下实现非常不理想,在render feature中我们能做的就是在camera setup和execute等回调函数中实现相应的翻转逻辑,而这样实现会出现闪烁的现象,猜测是一帧之内由引擎传入的各种矩阵是确定的,在一帧之内改变同一个镜头的位置不被urp支持,或是由于command buffer的渲染命令出于优化目的并非是立即执行的,所以翻转镜头的逻辑时序并不奏效。

因此,我们这里采用翻转要反射的物体进行实现。

通过绘制需要反射物体的render feature比较容易,我们首先需要一个绘制物体的render feature本身,然后在shader上额外增加一个pass来专门处理绘制反射物体。

2.1 Render feature的功能

首先render feature需要能够绘制翻转的物体,因此他的参数应该和urp内置的render objects的render feature相似,功能上比较简单:

这个render feature具有根据layer mask来过滤绘制物体的特征,也可以通过降采样和改变RT的格式来进行优化。而他绘制的层级中的物体应当具有一个reflection pass来处理反射的绘制,在这个绘制中我们对物体的坐标根据平面的位置进行翻转,再将高于平面的部分clip掉,即可得到一张反射的RT了。

2.2 绘制反射的shader

对于需要被反射的物体,我们需要额外增加一个reflection pass来处理。

首先需要明确的是我们需要在reflection pass中实现这两个功能:

根据反射平面反转物体

去除大于反射平面的部分

下面我们直接来看shader的结构:

Shader "ExampleShaderStructure"
{Properties{//Properties...}SubShader{//Global tags...//Variants...Pass{Name "ForwardPass"Tags{"LightMode" = "UniversalForward"}//Render state....HLSLPROGRAM//Variants...           #include "ForwardPass.hlsl"ENDHLSL}Pass{Name "ReflectionPass"Tags{"LightMode" = "ReflectionPass"}Cull Front//Render state....HLSLPROGRAM//Variants...          #define REFLECTION_PASS 1#include "ForwardPass.hlsl"ENDHLSL}//Othes passes...}FallBack "Hidden/Universal Render Pipeline/FallbackError"//Shader editor...
}

这里我们重用了forward pass的include代码forwardpass.hlsl,而在reflectionpass中额外做了一个宏定义来在forwardpass中增加镜面翻转的逻辑。

下面我们来看forwardpass中如何实现镜面翻转:

half _ReferencePlaneY;struct Attributes
{float4 positionOS   : POSITION;//Other parameters...
}struct Varyings
{
#if defined(REFLECTION_PASS)float3 reversedPositionWS       : TEXCROOD8;
#endiffloat4 positionCS               : SV_POSITION;//Other parameters...
}Varying VertexShader()
{Varyings output = (Varyings)0;//...#if defined(REFLECTION_PASS)float3 positionWS = output.positionWS;positionWS.y = _ReferencePlaneY - (positionWS.y - _ReferencePlaneY);output.reversedPositionWS = positionWS;output.positionCS = TransformWorldToHClip(positionWS);
#elseoutput.positionCS = vertexInput.positionCS;
#endifreturn output;
}half4 FragmentShader()
{half4 finalColor;#if defined(REFLECTION_PASS)clip(_ReferencePlaneY - input.reversedPositionWS.y);#endif//....return finalColor;
}

这里仅考虑了最简单的情况,也就是镜面反射的平面和XOZ平面平行的情况,这个时候我们仅需要根据Y对世界坐标进行修改即可。把翻转后的世界空间坐标作为参数传入fragment shader来处理高于镜面反射平面剔除的逻辑。而真正的世界空间坐标并没有改变,因此正常的光照依然可以执行。

需要注意reflection pass这里需要cull front来正确的执行剔除。

从frame buffer中可以看到渲染的RT

对比原来的场景

3 总结

相比于传统镜头方案,相比于镜头上可能存在的冗余的render feature挂载,多余的blit或者管线上的镜头逻辑设置,这个方案更为轻量级,仅适用一个pass就可以实现。

同时他可以通过降采样,修改rt格式,简化reflection pass中的光照实现来进一步优化性能。

而相比于compute shader实现的平面镜面反射,他又可以绘制出不在镜头中的部分,同时又有更好的兼容性。

URP - Render feature实现镜面反射相关推荐

  1. Unity3D URP中使用Render Feature实现后处理效果

    unity urp 自带了一个后处理组件Volume,提供了不少后处理效果: 除此之外,Render Feature 也可以实现类似的效果,并且自由度更高. 使用方式是,在RenderPiplineA ...

  2. Unity Render Feature示例

    参考教程:Scriptable Render Feature Unity 版本:2019.4 搭建URP场景 Render Feature作用是支持SRP扩展自定义渲染pass,因此需要在SRP下使用 ...

  3. Render Feature 水下环境解决方案

    1/水波 法线取rg值,因为z值为1 2/法线offest(法线空间)+屏幕UV -->输入到scene Texture中 3/根据深度控制颜色(越远越蓝) 4/控制Post高度 5/波光:使用 ...

  4. Unity Shader - URP - 抄作业 - Deep Crack - 裂痕深坑 - SRP Batch优化

    文章目录 环境 思路 建模 Houdini 设置好 Geometry + Curve + Extrude 3ds max 设置好参考背景图 使用:创建/图形/线,来勾勒刨面 封口刨面 转为可编辑多边形 ...

  5. DCC - Photoshop - Nvidia NormalMapFilter - 法线生成工具 - 顺便测试 Unity URP 12.1 中的 Decal System

    文章目录 NVIDIA Texture Tools Exporter 下载.安装 法线生成素材图 扣干净无用像素 使用 NVIDIA Normal Map Filter 生成贴图 配置好 URP Re ...

  6. Unity URP入门实战

    导读 本文讲述 如何从应用层面使用URP 如何在代码层面为URP增加更多的渲染特性 如果拓展URP的后处理效果 URP管线特性 光源数量: 直线光外加4个其他光源 内置管线的多Pass Forward ...

  7. URP——着色器和材质——复杂光照Complex Lit

    Complex Lit Shader 复杂的灯光着色器包含了灯光着色器的所有功能,并添加了高级的材质特性.一些特性在这个着色器可能是相当多的资源密集型和需要Unity Shader Model 4.5 ...

  8. URP——着色器和材质——灯光着色器 Lit

    Lit Shader 灯光着色器让你渲染真实世界的表面像石头,木材,玻璃,塑料,金属在照片现实的质量.您的光等级和反射看起来栩栩如生,并在各种光照条件下反应正确,例如明亮的阳光,或一个黑暗的洞穴.这个 ...

  9. 项目升级到URP遇到的问题

    Untiy 推出SRP 已经接近一年了,其中官方宣称 LWRP 在2018年年底时已经处于 production ready 既随时可以做产品了,于是改名为URP, 不过 HDRP 还需要2019.4 ...

最新文章

  1. 多线程join(加入)
  2. AIX系统文件安全性方面的几点考虑
  3. Android-上传图片(-)_HttpURLConnection
  4. 用C++写的 Levenshtein 算法实现
  5. win7打开计算机死机,怎么样解决Win7系统运行程序引起的死机问题
  6. Opencv dnn实现人类性别检测和年龄预测
  7. caffe linux 教程,Caffe 深度学习入门教程 - 安装配置Ubuntu14.04+CUDA7.5+Caffe+cuDNN_Linux教程_Linux公社-Linux系统门户网站...
  8. mysql 修改字段长度_面试官:InnoDB记录存储结构都不知道,你敢说你懂MySQL?
  9. Ubuntu18.04无法进入图形界面桌面的问题及解决
  10. WPS加载项深入开发代码ribbon解析
  11. 设计一个AOA蓝牙精准室内定位系统
  12. Delphi调用IE打开网页
  13. 互联网加速职场变革 大数据催生业界十大热门职业
  14. 段错误(核心已转储)错误及解决过程
  15. 如果你觉得累,这三个“高内耗”行为,一定要戒掉!
  16. ZBrush自带笔刷的特性你都知道哪些?
  17. J酒店上海中心天之锦餐厅成为全球建筑物中最高的景观餐厅
  18. 程序员笔记工具 cherrytree
  19. 图灵奖得主Yoshua Bengio:用因果打开AI的黑盒
  20. 四氧化三锰(CAS1317 35 7)的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告

热门文章

  1. 学习项目1(移动端京东)
  2. STM32之RTC实时时钟
  3. 微信小程序 后台播放,多页面播放
  4. 微信小程序-全局数据共享
  5. 从 LoG 到 DoG 再到 XDoG, FDoG
  6. 2012年中国各省市区GDP排行榜 附各主要城市GDP排行榜
  7. QT5 OpenGL (四, 绘制立体图形)
  8. 为此计算机上所有用户安装此加载项,win7打开特定网站提示“控件无法安装,windows已阻止此软件因为无法验证发行者”怎么办...
  9. DiskGenius分区移动硬盘
  10. Expected response code 250 but got code “501“, with messa php laravel 发邮件 smtp qq邮箱 阿里云