title: unity-shader-屏幕空间反射
categories: Unity3d-Shader
tags: [unity, shader, 屏幕空间反射]
date: 2019-06-18 22:22:28
comments: false

顾名思义, 是基于屏幕 rt 的.
这个 shader 并不适用于 移动平台, 只能跑在 游戏主机 及 桌面pc 上, 因为使用了 延迟渲染 gbuffer 中的 法线图.


前篇

  • unity学习笔记之屏幕空间反射(1) - https://zhuanlan.zhihu.com/p/61402704
  • UnityShader——屏幕空间反射(一) - https://blog.csdn.net/NotMz/article/details/80513711
  • Screen Space Reflection 学习笔记 - https://blog.csdn.net/hehemingsgc6/article/details/53888902
  • 相关 git 仓库
    • https://github.com/Xerxes1138/UnitySSR
    • https://github.com/bodhid/UnityScreenSpaceReflections

Raymarch

Raymarch 叫光线步进,是光线追踪在光栅化中运行的一个形式,当光线沿着他的方向向前走一个单位距离,检查一下是否碰到物体。有则停下,返回颜色或者深度结果。没有则继续向前,直到走到最大步数并终止。

下图是raymarch示意图

第四个步进的时候才碰撞到物体


效果


原理

前置条件

使用 Deferred Shading, 因为要使用到 法线图 及 高光图中.a 通道, 另外在使用到 深度图

流程

参考: https://github.com/bodhid/UnityScreenSpaceReflections 的流程分析

笔记仓库中的 SSR-Simple

总的流程分两步, 异步是正常的 延迟渲染, 然后通过 后处理, 计算出 反射 部分的 RT, 然后根据 光滑度 及 反射因子 进行 lerp 插值得到最终的像素

  1. 后处理计算出 反射 部分的 RT

    1. 利用 深度图, 计算出像素点的世界坐标位置.

      利用深度图 构建 ndc 坐标 (注意 z 值应该做平台区分, dx (0~1) 和 opengl(-1~1) 不一样), 再用 vp矩阵的 逆矩阵 (有 csharp 中计算好传入 shader) 算出 世界坐标

      (xyzMatrix = mul(_CAMERA_XYZMATRIX, float4(uv_depth*2.0 - 1.0, SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv_depth), 1.0))) / xyzMatrix.w;
      
    2. 使用 gbuff 中的 法线图, 算出 反射 方向

      // 从 gbuffer 的 法线图 获取 世界空间下的 法线值, 并转到 [-1, 1] 区间下
      float3 worldNormal = tex2D(_CameraGBufferTexture2, i.uv).rgb * 2.0 - 1.0;
      // dir 是 观察方向的 反射方向, 且有 步进
      dir = reflect(viewDir, worldNormal) * sampleDistance;//sample dis
      
    3. 进行 ray 碰撞算法

  2. 将 反射 部分的 RT 进行 高斯模糊 一下, 效果会好点

    //blur SSR result
    for (int i = 0; i < blurAmount; ++i) {blurMaterial.SetVector("_Direction", new Vector4(1, 0, 0, 0));Graphics.Blit(tempA, tempB, blurMaterial);blurMaterial.SetVector("_Direction", new Vector4(0, 1, 0, 0));Graphics.Blit(tempB, tempA, blurMaterial);
    }
    
  3. 然后根据 光滑度 及 反射因子 进行 lerp 插值得到最终的像素

    float4 ssr = tex2D(_SSR,i.uv); // _SSR 反射 部分的 RT// 取出 gbuffer 的 光滑度
    float smoothness = tex2D(_CameraGBufferTexture1,i.uv).a;
    float4 col = tex2D(_MainTex, i.uv); // _MainTex 正常渲染的 后处理 原图// ssr.a 是 碰撞的 步进次数相关, 步进越大表示应该反射的效果越差
    return col * lerp(1, ssr, smoothness * ssr.a);
    

unity 内置 Post-processing 中的 ssr

官网文档: Screen Space Reflection - https://docs.unity3d.com/Manual/PostProcessing-ScreenSpaceReflection.html

for Projects running on current-gen consoles and desktop computers. It’s not suitable for mobile development. Because it relies on the Normals G-Buffer, it is only available in the deferred rendering path.

可以跑在 游戏主机 及 桌面pc, 不适用于 移动平台. 因为使用了 延迟渲染 gbuffer 中的 法线图.

unity-shader-屏幕空间反射相关推荐

  1. Unity Shader·屏幕抖音效果

    Unity Shader·屏幕抖音效果 前言 最近在做一个新的MMD(用Unity来实现),其中用到了一些好看的渲染技术在这里分享一下. 视频链接 https://www.bilibili.com/v ...

  2. Unity Shader·屏幕破碎效果

    Unity Shader·屏幕破碎效果 前言 最近在做一个新的MMD(用Unity来实现),其中用到了一些好看的渲染技术在这里分享一下. 视频链接 https://www.bilibili.com/v ...

  3. Unity Shader屏幕特效基础OnRenderImage()函数

    前言:  unity shader中的pass是会顺序执行的,但是由于在图像处理中我们常常需要使用一个pass的处理结果作为另一个pass的输入,这个时候就需要用到OnRenderImage()函数了 ...

  4. Unity Shader 屏幕后处理之血屏

    欢迎来到我的第一篇博客 看了冯乐乐老师的<Unity Shader入门精要>在感叹Shader牛逼的同时也对图形学产生了莫大的兴趣,推荐各位在学Unity已及对Shader有兴趣的小伙伴一 ...

  5. Unity Shader 屏幕后效果——高斯模糊

    高斯模糊是图像模糊处理中非常经典和常见的一种算法,也是Bloom屏幕效果的基础. 实现高斯模糊同样用到了卷积的概念,关于卷积的概念和原理详见我的另一篇博客: https://www.cnblogs.c ...

  6. Unity Shader 屏幕后效果——Bloom外发光

    Bloom的原理很简单,主要是提取渲染图像中的亮部区域,并对亮部区域进行模糊处理,再与原始图像混合而成. 一般对亮部进行模糊处理的部分采用高斯模糊,关于高斯模糊,详见之前的另一篇博客: https:/ ...

  7. Unity Shader 屏幕抓取,屏幕坐标

    GrabPass("Name") 抓取屏幕,抓取后名字为Name 屏幕坐标 获取屏幕坐标有3种方法: #####SV_POSITION语义的xy 使用SV_POSITION语义,在 ...

  8. Unity shader学习之屏幕后期处理效果之高斯模糊

    高斯模糊,见 百度百科. 也使用卷积来实现,每个卷积元素的公式为: 其中б是标准方差,一般取值为1. x和y分别对应当前位置到卷积中心的整数距离. 由于需要对高斯核中的权重进行归一化,即使所有权重相加 ...

  9. Unity Shader学习:SSR屏幕空间反射

    Unity Shader学习:SSR屏幕空间反射 本文在前向渲染模式下实现,延迟渲染更适合SSR,这里只简单的实现下,未作更深入的优化. 思路:沿视线和法线的反射向量步进光线,判断打到物体(这里用的是 ...

  10. 【Unity Shader】屏幕后处理3.0:均值模糊和高斯模糊

    发现之前学习记录的太过详细,导致整理的过程占用太长的时间了,这篇之后博客重要的是掌握实现过程,关于基础的理论会更多的放上别人写得更好的文章. 参考:[Unity Shader编程]之十五 屏幕高斯模糊 ...

最新文章

  1. NME的GLSL支持情况
  2. oracle idm suite,CorelDRAW Graphics Suite 2018官方英文试用版 离线直接安装 下载地址
  3. [数据库] Navicat for MySQL定时备份数据库及数据恢复
  4. 在Websphere 8.0上安装Liferay 6.2 Enterprise Edition
  5. python 生成器表达式_Python中的列表理解与生成器表达式
  6. 投资数据中心所考虑的重要因素
  7. “页面制作人员”?“页面工程师”?“页面架构师”?滚一边去!
  8. win7休眠设置在哪里_win7电脑不休眠怎么设置
  9. 【SCIR笔记】ACL20 让模型“事半功倍”,探究少样本序列标注方法
  10. csv文件-读取方式、字典
  11. php自学好还是培训,转行php选择自学还是培训
  12. xp计算机如何查看内存大小,xp如何查看内存大小
  13. C#实现图像下一张上一张
  14. 汽车电工及电子技术基础【3】
  15. MT6573 android 系统默认语言处理流程
  16. centos7安装杀毒软件ClamAV
  17. JSP页面请求和响应
  18. 【Java】GUI图形化界面中,setBounds()中参数的含义
  19. 阿里云对象存储OSS存储照片
  20. Defcon - 2015 - 初赛 - r0pbaby writeup

热门文章

  1. c语言编程餐厅点餐系统,C语言实现餐饮管理与点餐系统.pdf
  2. 小米机器人清理主刷和轴承_小米扫地机器人的噪音感觉有点大怎么办?
  3. sherlock常用算法指令总结
  4. mysql 查询最接近某时间的数据
  5. Koordinator 0.6:企业级容器调度系统解决方案,引入 CPU 精细编排、资源预留与全新的重调度框架
  6. AutoJs学习-录屏功能
  7. mac下安装nvm以及node
  8. vue打包时报错Ineffective mark-compacts near heap limit Allocation failed-JavaScript heap out of memory
  9. 机房PUE是什么,对节能有哪些帮助?
  10. 神州租车用户口碑佳,原因有3点