首页 > 其他分享 >Unity的阴影初步了解

Unity的阴影初步了解

时间:2024-04-10 09:00:22浏览次数:26  
标签:渲染 光源 阴影 初步 Unity 空间 联级 屏幕

起因:

最近学习了Unity内的实时阴影的计算,所以这里总结收录一下,加深一下印象。下面分别介绍ShadowMap和屏幕空间阴影和联级阴影的计算流程。
image

阴影计算流程:

  1. 首先获得当前摄像机观察到深度纹理。在延迟渲染中,这张深度图Unity已经帮忙计算好了,前向渲染中,我们则需要等待场景都被渲染了一遍,把深度渲染到深度图中。
  2. 在从“光源处”出发得到从该光源处观察到的深度纹理,也被称为这个光源的ShadowMap。
  3. 在屏幕空间中做一次阴影收集计算(Shadow Collector),得到一张屏幕空间的阴影纹理。
  4. 在为正常物体渲染阴影时,只需要在片元着色器中对步骤3得到的屏幕空间阴影采样即可。

详细介绍:

下面详细介绍下各个步骤的过程。

shader代码

我们先简单写一个仅会产生阴影的Shadow

Shader "Unlit/PhongJian"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            Tags{"LightMode" = "ForwardBase"}
            
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
			#pragma multi_compile_fwdbase
			#include "UnityCG.cginc"
			#include "AutoLight.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 pos : SV_POSITION;
                SHADOW_COORDS(1)    // 声明一个用于阴影纹理采样的坐标
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;

            v2f vert (appdata v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                TRANSFER_SHADOW(o);         // 用于计算上一步申明的阴影纹理坐标
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                half shadow = SHADOW_ATTENUATION(i);
                return fixed4(shadow.xxx, 1);
            }
            ENDCG
        }
    }
    
    Fallback "Diffuse" 
}

其中注意,必须在末尾写一个带有ShaowCaster实现的shader,不然我们就需要自己实现了;appdata输入的顶点必须叫vertex;v2f输出的顶点必须名为pos,不然TRANSFER_SHADOW宏编译会报错

传统实时阴影

因为旨在了解传统实时阴影的生成流程,我们先将Unity内置的联级阴影给关掉。
image
将阴影距离调整到10,这样阴影看的更清楚
image
将摄像机调整到前向渲染,也是默认的渲染模式
image
我们可以看到,它经历了名为ShaowCaster,输出了光源处的阴影贴图,此时你旋转平行光,会发现这张贴图也会改变,原理是因为是在光源处对物体进行观察得到的ShadowMap
image
此时我们可以看到,在绘制Mesh时,它传入了上一步得到的阴影,最终将它们绘制到屏幕上去
image

屏幕空间阴影

先在Project Settings/Graphics打开联级阴影的设置
image
然后在Project Settings/Quality中取消联级阴影
image
我们可以看到它首先绘制了一张摄像机视角下的深度图
image
然后绘制一张从光源处出发的深度图
image
然后在屏幕空间做一次阴影收集计算(Shadows Collector),这里把每个像素根据它在摄像机深度纹理中的深度值得到世界空间坐标,再把坐标从世界空间转化到光源空间中,和光源空间中的ShadowMap里的深度值做对比,如果大于ShadowMap中的深度距离,说明光源无法照射到
image
最后在绘制Mesh,它传入上一步得到的屏幕空间阴影,最终混合并绘制到屏幕上去
image

联级阴影

打开联级阴影的设置
image
联级阴影流程可以认为是在屏幕空间阴影上做了优化,流程基本大同小异,除了会随着观察距离的远近,生成多张光源处贴图,我们看到移动到特定角度,生成了3张贴图
image
打开Shadows Cascades,我们确实观察到此时处于绿色范围内
image
最终输出效果也更加柔和
image

资料参考:

  1. https://www.zhihu.com/question/52718833/answer/132200901?utm_campaign=shareopn&utm_medium=social&utm_psn=1760936896992014336&utm_source=wechat_session

标签:渲染,光源,阴影,初步,Unity,空间,联级,屏幕
From: https://www.cnblogs.com/chenxiayun/p/18123065

相关文章

  • CSS -层叠性、继承性、盒子模型、盒子模型表格、盒子模型margin、盒子阴影
    层叠性CSS层叠性(Cascading)是指在网页中应用多个样式规则时,根据一定的规则来确定最终应用的样式。层叠性使得样式可以按照一定的优先级和规则进行组合和覆盖,从而实现对元素的样式控制。层叠性的影响因素:选择器的特殊性(Specificity):选择器的特殊性决定了样式规则的优先级。......
  • Unity性能优化-C#篇
    Unity性能优化-C#篇 1.UnityAPI GameObject.GetComponentUnity是基于组件的开发方式,所以GetComponent是一个高频使用的函数每次调用GetComponent时,Unity都要去遍历所有的组件来找到目标组件每次都去查找是不必要的耗费,可以通过缓存的方式来避免这些不必要的开销其中......
  • Apr.8.2024 汇编中in&out的用法 显卡的初步探索
    为了读取/写入io,我们可以使用in指令和out指令in指令可以读取数据inax,dxinal,dx只能使用ax寄存器和dx寄存器,其中ax/al用来存储数据,dx指定端口同样还有out指令outdx,aloutdx,axout0x1234,alout0x1234,axout指令中,dx/立即数是端口号,al是数据——————————......
  • Unity类银河恶魔城学习记录12-7-2 p129 Craft UI - part 2源代码
    Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释,可供学习Alex教程的人参考此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibiliUI_CraftWindow.csusingUnityEngine.UI;usingTMPro;usingUnityEngine;usingU......
  • Unity编辑器中运行正常,发布后报shader为null异常问题解决方案
    在Unity中,Shader是从代码中进行加载的,编辑器中并没有引用。在编辑器中运行项目没有问题,但当项目发布到移动平台,如ios、android、UWP之后,游戏中并不能找到对应的shader。因为Shader在场景中并未被引用,所以没有被打包。解决办法1在ProjectSettings里面的Graphics,添加上修改的打包......
  • 【UnityRPG游戏制作】Unity_RPG项目之界面面板分离和搭建
    ......
  • Unity类银河恶魔城学习记录12-7-1 p129 Craft UI - part 1源代码
    Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释,可供学习Alex教程的人参考此代码仅为较上一P有所改变的代码【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibiliUI_CraftList.csusingSystem.Collections;usingSystem.Collections.Generic;usin......
  • TalkingData——Unity应用开发中集成统计分析工具
    第一步:帐号注册官方网站:TalkingData-移动.数据.价值第二步:创建应用查看appid可以进入网站注册,注册好以后就可以创建应用 创建好应用后,点击 应用管理-》基本信息就可以查看自己的AppID第三步:申请对应平台的sdk 接下来就是申请sdk这里是申请sdk的网站:SDK定制填写......
  • Unity WebGL火狐浏览器配置
    特此声明:此配置容易内存溢出,只适合小型Webgl运行,推荐使用本地服务器打开WebGL火狐浏览器下载地址:https://www.firefox.com.cn/1.打开火狐浏览器输入:about:config2.将这几项,设置对应属性ebgl.force-enabledtruewebgl.disabled......
  • C++从入门到精通——初步认识面向对象及类的引入
    初步认识面向对象及类的引入前言一、面向过程和面向对象初步认识C语言C++二、类的引入C++的类名代表什么示例C++与C语言的struct的比较成员函数访问权限继承默认构造函数默认成员初始化结构体大小总结前言面向过程注重任务的流程和控制,适合简单任务和流程固定的......