在Unity中实现屏幕空间反射Screen Space Reflection(1)

您所在的位置:网站首页 屏幕空间反射效果 在Unity中实现屏幕空间反射Screen Space Reflection(1)

在Unity中实现屏幕空间反射Screen Space Reflection(1)

2024-07-12 01:16:04| 来源: 网络整理| 查看: 265

本篇文章我会介绍一下我自己在Unity中实现的SSR效果 出发点是理解SSR效果的原理,因此最终效果不是非常完美的(代码都是够用就行),但是从学习的角度来说足以学习到SSR中的核心算法。 如果对核心算法没有兴趣,可以直接使用Unity官方的PostProcessing库,其中包含了一个SSR效果。(其实现来自于casual effects)

参考资料: https://github.com/Unity-Technologies/PostProcessing http://www.kode80.com/blog/2015/03/11/screen-space-reflections-in-unity-5/ http://casual-effects.blogspot.com/2014/08/screen-space-ray-tracing.html

完成的工程: https://github.com/yangrc1234/ScreenSpaceReflection 目前只在2017.1、DirectX下实现,没有进行其他测试。除非以后有需求,否则可能不会更新这个repo,毕竟官方已经有解决方案了,没必要重复造轮子。这个repo用于学习目的就行了。 一些shader的宏、变量可能是2017.1才有的,如果老版本编译不过欢迎提issue。

第一部分包含屏幕空间反射的定义、以及一个最初步的实现。

屏幕空间反射

屏幕空间反射是一个后处理效果。通过对屏幕空间的画面,按一定方式投射光线,采样光线路径上的像素,得到一个点上的反射颜色。 比如说,对于一个像素A,我们去计算它的反射。要计算反射,我们必须要知道视线方向和该点的空间位置以及的法线方向,从而计算出光线的方向。 视线方向好说,空间位置,我们可以从深度贴图中还原出来。法线方向意味着屏幕空间反射只能在Deferred Rendering下进行。在Deferred Rendering下我们可以轻松的从GBuffer中得到一个点的法线方向。

获取这些信息后,我们就可以开始投射光线了。每次光线步进,我们都将当前位置的点再投影到屏幕空间上,去采样屏幕上的像素。如果我们计算得到(如何计算等下再说)该像素是光线路径上的一点,我们就可以将该点返回作为结果了。

以下是实际代码:

[ImageEffectOpaque] private void OnRenderImage(RenderTexture source, RenderTexture destination) { mat.SetTexture("_BackfaceTex", GetBackfaceTexture()); mat.SetMatrix("_WorldToView", GetComponent().worldToCameraMatrix); //emmmmm不知道为什么UNITY_MATRIX_V在这里变成了一个单位矩阵。需要手动设置world to view的矩阵。 Graphics.Blit(source, destination, mat,0); } v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = v.uv; float4 cameraRay = float4(v.uv * 2.0 - 1.0, 1.0, 1.0); //作为一个后期特效,我们可以通过uv坐标,来获得相机光线方向。注意坐标z为1.0,这里的cameraRay是从原点到far clip plane的光线 cameraRay = mul(unity_CameraInvProjection, cameraRay); //将相机光线从clip space转移到view space o.csRay = cameraRay / cameraRay.w; return o; } fixed4 frag (v2f i) : SV_Target { float decodedDepth = Linear01Depth(tex2D(_CameraDepthTexture, i.uv).r); float3 csRayOrigin = decodedDepth * i.csRay; //因为i.csRay是指着far clip plane的光线,此时csRayOrigin是view space的光线起点 float3 wsNormal = tex2D(_CameraGBufferTexture2, i.uv).rgb * 2.0 - 1.0; //世界坐标系下的法线 float3 csNormal = normalize(mul((float3x3)_WorldToView, wsNormal)); //将转换到view space float2 hitPixel; float3 debugCol; if (traceRay( //检测相交 csRayOrigin, normalize(reflect(csRayOrigin, csNormal)), hitPixel, //out debugCol)) //out { reflection = (1 - rayPercent) * tex2D(_MainTex, hitPixel); } //return float4(debugCol, 1); return tex2D(_MainTex, i.uv) + tex2D(_CameraGBufferTexture1,i.uv) * half4(reflection,1); }

在traceRay方法中,我们进行实际的光线投射、相交检测。 traceRay的签名中我设置了一个debugCol的参数,当我需要debug这个函数时,我将需要debug的内容放到debugCol中,在main里输出debugCol的颜色。这只是我个人的习惯。 对于反射颜色的计算,我只是简单的获取了那个像素的颜色,然后加到输出里去而已。事实上,因为我们是在Deferred rendering模式下,我们可以获取到该点的所有的用于着色的信息,用这些信息我们可以进行一次完整的基于物理着色。在PostProcessing中的SSR就是这么做的,可以参考一下。



【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭