| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 游戏开发 -> Unity下平面反射实现 -> 正文阅读 |
|
[游戏开发]Unity下平面反射实现 |
平面反射通常指的是在镜子或者光滑地面的反射效果上,如下图所示, 一、平面反射的原理对于光照射到物体表面然后发生完美镜面反射的示意图,如下所示, 1.1 平面反射矩阵1.1.1 平面方程的计算我们现在来推导一下把摄像机关于平面对称的反射矩阵。
我们可以用以上的一个Vector4表示一个平面,前三个分量表示normal,第四个分量表示d。 1.1.2 平面反射矩阵的计算
假设n为(nx,ny,nz),已知d的值,A是(x,y,z)点作为我们要变换的点,A’为(x’,y’,z‘),那么我们可以得到: 1.2 斜裁剪矩阵上面我们已经推导出平面反射矩阵,不过还有一种特殊情况需要处理。 二、平面反射的实现2.1 平面反射的脚本这里的脚本指的是生成RenderTexture需要的脚本,脚本继承自MonoBehaviour。 2.1.1 默认管线下的实现默认管线下需要在函数OnWillRenderObject中,基本步骤是先计算反射平面,然后计算反射矩阵和斜投影矩阵,设置反射相机的斜投影矩阵,然后将反射相机变换到平面对面,调用相机的Render函数渲染RT。需要注意的是,渲染的时候需要修改物体正反旋向,即GL.invertCulling设置为true。 2.1.2 Urp管线下的实现Urp管线下,需要绑定 RenderPipelineManager.beginCameraRendering的回调,然后在回调中实现。回调中会接收到当前渲染的相机,反射相机就是该相机关于平面的镜像。同时,渲染RT的函数需要改成UniversalRenderPipeline.RenderSingleCamera,传入context和反射相机。其余步骤,跟默认管线的区别不大。 2.2 平面反射的Shader平面反射的shader可以使用普通的场景shader做修改。关键在于如何采样平面反射信息和平面反射强度以及模糊等。 2.2.1 平面反射信息的采样这个之前已经解释过用屏幕空间坐标来采样RT。 2.2.1 平面反射强度这个可以用菲涅尔定律计算,不过关键点在于强度必须是NdotV的函数,最简单的方式是计算出NdotV,同时提供一个最大最小值来限制强度范围。 2.2.1 模糊和Mipmap可以采样周围多个像素然后做平均模糊或者高斯模糊。不过,最简单的方式是对RT强制生成Mipmap,采样RT的时候指定Mipmap级别。那么,mipmap级别如何计算了。我们可以根据shader的粗糙度来转行为mipmap级别,这个参考unity的urp内置shader函数PerceptualRoughnessToMipmapLevel的实现。 最终得到的反射效果如图, 三、平面反射的优化平面反射由于需要对场景镜像渲染一遍, DrawCall会翻倍,而且由于原理限制,没有有效的优化手段,因此平面反射通常是应用在特定的场合下。 3.1 控制反射层级我们可以在反射脚本中增加层级控制,然后设置反射相机的cullingMask,指定层级的物体才会被渲染到RT中。 3.2 控制反射RT的尺寸可以根据反射平面的大小来调整RT的尺寸,同样我们可以在脚本中开放这个尺寸设置来方便美术来调整RT大小。 3.3 降低RT的shader复杂度我们可以使用Unity的shader replacement将生成RT的shader都替换为一个简单的shader,然后再渲染生成RT,这样可以大幅度降低shader计算复杂度。不过,DrawCall是无法降低的。 参考资料
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/27 16:45:50- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |