[Unity] vertex-frag形式的shader中接受Unity内置阴影

2024-04-13 10:32

本文主要是介绍[Unity] vertex-frag形式的shader中接受Unity内置阴影,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Unity5之前,想要接受阴影需要一个名为ShadowCollector的Pass.参考这里:

https://forum.unity.com/threads/i-put-a-shadowcollector-pass-in-my-shader-but-why-does-it-cant-recieves-shadow-why.160010/

但是Unity5之后这个Pass已经没有用了,参见官网:

https://docs.unity3d.com/Manual/UpgradeGuide5-Shaders.html

有如下说明:

然后Unity5之后,想要接受阴影,比较简单网上例子也比较多的是在surface shader中实现,这里不多说.下面总结一个在vf形式的shader中添加接受阴影的方法(注意这里简短起见没有自己写投射阴影的ShadowCaster Pass,投射阴影是读取了Fallback "Mobile/VertexLit"中的这个Pass).我们以一个Lambert光照模型为基础,添加接受阴影的功能.

Shader "Custom/Diffuse_ReceiveShadow"
{Properties{_MainTex ("Texture", 2D) = "white" {}}SubShader{Tags { "RenderType"="Opaque" }LOD 100Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag// make fog work#pragma multi_compile_fog#pragma multi_compile _ SHADOWS_SCREEN //相关宏#include "UnityCG.cginc"#include "AutoLight.cginc" //SHADOW_COORDS需要#include "Lighting.cginc"struct appdata{float4 pos : POSITION;float2 uv : TEXCOORD0;float3 normal : NORMAL;};struct v2f{float4 pos : SV_POSITION;float2 uv : TEXCOORD0;float3 worldNormal : TEXCOORD1;float3 worldPos : TEXCOORD2;UNITY_FOG_COORDS(3)SHADOW_COORDS(4) //按TEXCOORD数递增};sampler2D _MainTex;float4 _MainTex_ST;v2f vert (appdata v){v2f o;o.pos = UnityObjectToClipPos(v.pos);o.uv = TRANSFORM_TEX(v.uv, _MainTex);o.worldPos = mul(unity_ObjectToWorld, v.pos);o.worldNormal = mul(v.normal, (float3x3)unity_WorldToObject);TRANSFER_SHADOW(o); //vertex中的处理UNITY_TRANSFER_FOG(o,o.pos);return o;}fixed4 frag (v2f i) : SV_Target{// sample the texturefixed3 col = tex2D(_MainTex, i.uv);fixed3 worldNormal = normalize(i.worldNormal);fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);UNITY_LIGHT_ATTENUATION(atten, i, i.worldPos); //fragment中的处理,输出到attenfixed3 diffuse = _LightColor0.rgb * atten * col * saturate(dot(worldNormal, worldLightDir));fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;fixed3 color = ambient + diffuse;// apply fogUNITY_APPLY_FOG(i.fogCoord, color) ;				return fixed4(color, 1.0);}ENDCG}}
Fallback "Mobile/VertexLit"
}

简单添加这5处修改之后,我们就可以在游戏中看到接受阴影的效果了.

 

参考资料:

https://catlikecoding.com/unity/tutorials/rendering/part-7/

这篇关于[Unity] vertex-frag形式的shader中接受Unity内置阴影的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/899894

相关文章

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

Nginx添加内置模块过程

《Nginx添加内置模块过程》文章指导如何检查并添加Nginx的with-http_gzip_static模块:确认该模块未默认安装后,需下载同版本源码重新编译,备份替换原有二进制文件,最后重启服务验... 目录1、查看Nginx已编辑的模块2、Nginx官网查看内置模块3、停止Nginx服务4、Nginx

C#和Unity中的中介者模式使用方式

《C#和Unity中的中介者模式使用方式》中介者模式通过中介者封装对象交互,降低耦合度,集中控制逻辑,适用于复杂系统组件交互场景,C#中可用事件、委托或MediatR实现,提升可维护性与灵活性... 目录C#中的中介者模式详解一、中介者模式的基本概念1. 定义2. 组成要素3. 模式结构二、中介者模式的特点

Python内置函数之classmethod函数使用详解

《Python内置函数之classmethod函数使用详解》:本文主要介绍Python内置函数之classmethod函数使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 类方法定义与基本语法2. 类方法 vs 实例方法 vs 静态方法3. 核心特性与用法(1编程客

如何确定哪些软件是Mac系统自带的? Mac系统内置应用查看技巧

《如何确定哪些软件是Mac系统自带的?Mac系统内置应用查看技巧》如何确定哪些软件是Mac系统自带的?mac系统中有很多自带的应用,想要看看哪些是系统自带,该怎么查看呢?下面我们就来看看Mac系统内... 在MAC电脑上,可以使用以下方法来确定哪些软件是系统自带的:1.应用程序文件夹打开应用程序文件夹

UE5 半透明阴影 快速解决方案

Step 1: 打开该选项 Step 2: 将半透明材质给到模型后,设置光照的Shadow Resolution Scale,越大,阴影的效果越好

Python 内置的一些数据结构

文章目录 1. 列表 (List)2. 元组 (Tuple)3. 字典 (Dictionary)4. 集合 (Set)5. 字符串 (String) Python 提供了几种内置的数据结构来存储和操作数据,每种都有其独特的特点和用途。下面是一些常用的数据结构及其简要说明: 1. 列表 (List) 列表是一种可变的有序集合,可以存放任意类型的数据。列表中的元素可以通过索

python内置模块datetime.time类详细介绍

​​​​​​​Python的datetime模块是一个强大的日期和时间处理库,它提供了多个类来处理日期和时间。主要包括几个功能类datetime.date、datetime.time、datetime.datetime、datetime.timedelta,datetime.timezone等。 ----------动动小手,非常感谢各位的点赞收藏和关注。----------- 使用datet

Unity Post Process Unity后处理学习日志

Unity Post Process Unity后处理学习日志 在现代游戏开发中,后处理(Post Processing)技术已经成为提升游戏画面质量的关键工具。Unity的后处理栈(Post Processing Stack)是一个强大的插件,它允许开发者为游戏场景添加各种视觉效果,如景深、色彩校正、辉光、模糊等。这些效果不仅能够增强游戏的视觉吸引力,还能帮助传达特定的情感和氛围。 文档

Linux内置的审计跟踪工具:last命令

如果你是一个服务器管理员,你或许知道你要保护你的服务器的话,不仅是从外部,还要从内部保护。Linux有一个内置工具来看到最后登陆服务器的用户,可以帮助你保护服务器。   这个命令是last。它对于追踪非常有用。让我们来看一下last可以为你做些什么。   last命令的功能是什么   last显示的是自/var/log/wtmp文件创建起所有登录(和登出)的用户。这个文件是二进制