IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> Unity学习shader笔记[三十六]一些反射效果的简单总结 -> 正文阅读

[游戏开发]Unity学习shader笔记[三十六]一些反射效果的简单总结

之前工作需求,需要先了解一下各个平面反射,这里稍微总结一下
网上比较全的总结 Unity Shader-反射效果(CubeMap,Reflection Probe,Planar Reflection,Screen Space Reflection)

CubeMap

参考案例: CubeMap(立方体贴图)
原理 一个点通过自身反射方向或者其他物理方向等去采样一个附着在正方体上的纹理
通过
画面表现 好
这种做法一般用于静态的不会变化的环境反射,需要提前做好cubemap图,还要注意开启了BoxProjection和没开的区别
Unity3D ShaderLab 之 BoxProjectedCubemapDirection解读

性能表现 好
实时计算量少的一般性能都好

使用注意事项
可以使用反射探针Bake生成的图作为Shader中的Cubemap
反射探针生成的图的后缀是.exr 一些工具调用UnityAPI生成的图的后缀可能不同
但实际上好像都是Cubemap
Shader中用如下代码使用BoxProjection读取天空盒,

BoxProjectedCubemapDirection(normalize(input.reflectionDir), input.pos_WS, unity_SpecCube0_ProbePosition, unity_SpecCube0_BoxMin, unity_SpecCube0_BoxMax);

最好用ReflectionProbe渲染的CubeMap,这样用上述代码读取CubeMap纹理时,ReflectionProbe也对应开启BoxProjection选项,读取出来的CubeMap在映射时才容易与场景对称。
此外还要注意ReflectionProbe的BoxSize调成正方形的模式比较容易与场景对称在这里插入图片描述
需要注意的是,只有标记为”ReflectionProbe Static”的对象才会被反射探头取样,从属性接口上静态对象(Static)的下拉选单打勾即可

另外调节ReflectionProbe的范围注意这两个地方要打开并且同时要选中反射探针
在这里插入图片描述

在这里插入图片描述

SSR

屏幕空间反射
参考案例: unity-screen-space-reflection
原理
这里是参考案例中的原理,参考案例使用的是前向渲染
相机每帧获取颜色图和深度图,
法线图作为类似延迟渲染的GBuffer变量在shader中由unity传入,
相机对颜色图做shader中的后处理

Shader中,地面的点沿着视线与点的法线形成的反射向量方向步进,
每步进一定距离后都通过流水线的VP矩阵以及其次除法转换出NDC下的坐标,
再将坐标*0.5+0.5的方式转换到屏幕坐标下,拿到坐标z值作为深度,
深度图中的uv值是由屏幕坐标下的xy值组成,
所以这时用屏幕坐标下的xy值采样深度图
得到的深度后与自己的深度作对比
即判断步进点和屏幕上与步进点位置相同点的深度
根据深度图越靠近相机越黑 越远离相机越白的特点
深度比深度图的小说明步进点更靠近相机,
说明步进点已经穿过深度图的点并且往相机更加靠近了
需要往回走更小的步进路程 这样来回趋近去找到在反射方向上最贴近深度图的点
然后根据这个点的UV采样颜色图作为该点的颜色

性能表现 不太好
原因 插件的处理中,每个片源函数需要10次的左右的vp矩阵运算和深度图采样

画面表现 不太好
原因 这个过程中存在数字精度不够、缺少光栅化细节处理的问题 且网上我还没找到成熟的解决方案
一般的SSR需要做模糊处理,并且成像的反面不能被映射出来,例如悬空在平面上的鞋底

PR

平面反射
参考案例 : Unity学习shader笔记[三十]镜面shader
原理
用一个相机P采用主相机的V矩阵和P矩阵 在V矩阵之前乘一个平面转换矩阵,
相当于这个相机的成像在世界空间中都做了一次平面对称转换。
然后P的成像生成一张RT,传入平面中,平面将其片源转换到屏幕空间中
xy值作为uv采样RT 采样到的就是平面在RT中的部分
这样镜面的成像就只在平面中显示了

性能表现 好
原因
P相机生成一张RT 相当于又走了一次完整渲染流程
在反射的对象是全屏物体时 DC等消耗几乎翻倍
在反射对象用层控制之后 DC等消耗可以少到比较乐观的程度
每帧的每个物体只是在几何阶段的顶点着色器中多乘了一个矩阵
平面的片源着色器中采样也只是进行了一次

画面表现 好
原因
反射成像RT只是在顶点着色器中做了一次平面转换 其他地方都是跟着渲染流程走
细节方面渲染流程都帮你解决了

SSPR

屏幕空间平面反射
参考案例: Screenshot
原理
相机每帧获取颜色图和深度图,逆矩阵转换到世界空间后
进行平面矩阵转换,得到的镜面位置信息 转换到屏幕空间后xy作为uv采样色彩图
将该点的色彩叠加上自己本身的色彩
最后将图像输出

性能表现 一般
原因
每帧每个片源两次采样 三次矩阵转换

画面表现 一般
原因
这个过程中存在数字精度不够、平面转换后像素重叠等问题
但是网上有稍微成熟的解决方案 是基于URP的
GraphicsLab Project 之 Screen Space Planar Reflection
成像还算可以

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-07-27 16:34:25  更:2021-07-27 16:35:07 
 
开发: 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年5日历 -2024/5/1 2:15:19-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码