[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

相关文章

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文件创建起所有登录(和登出)的用户。这个文件是二进制

Unity协程搭配队列开发Tips弹窗模块

概述 在Unity游戏开发过程中,提示系统是提升用户体验的重要组成部分。一个设计良好的提示窗口不仅能及时传达信息给玩家,还应当做到不干扰游戏流程。本文将探讨如何使用Unity的协程(Coroutine)配合队列(Queue)数据结构来构建一个高效且可扩展的Tips弹窗模块。 技术模块介绍 1. Unity协程(Coroutines) 协程是Unity中的一种特殊函数类型,允许异步操作的实现

内置带so的APK为系统APK方法

(1)若内置为可卸载的APK,可以无需解压出lib直接编译就可以 具体参考http://blog.csdn.net/a462533587/article/details/46380795 (2)若内置为system APP,上述blog也有两种方式: 方法一:   如下例,在Android.mk中添加并配置变量(注意路径对应): LOCAL_PREBUILT_JNI_LIBS = \

Unity 资源 之 Super Confetti FX:点亮项目的璀璨粒子之光

Unity 资源 之 Super Confetti FX:点亮项目的璀璨粒子之光 一,前言二,资源包内容三,免费获取资源包 一,前言 在创意的世界里,每一个细节都能决定一个项目的独特魅力。今天,要向大家介绍一款令人惊艳的粒子效果包 ——Super Confetti FX。 二,资源包内容 💥充满活力与动态,是 Super Confetti FX 最显著的标签。它宛如一位

Unity数据持久化 之 一个通过2进制读取Excel并存储的轮子(4)

本文仅作笔记学习和分享,不用做任何商业用途 本文包括但不限于unity官方手册,unity唐老狮等教程知识,如有不足还请斧正​​ Unity数据持久化 之 一个通过2进制读取Excel并存储的轮子(3)-CSDN博客  这节就是真正的存储数据了   理清一下思路: 1.存储路径并检查 //2进制文件类存储private static string Data_Binary_Pa

Unity Adressables 使用说明(一)概述

使用 Adressables 组织管理 Asset Addressables 包基于 Unity 的 AssetBundles 系统,并提供了一个用户界面来管理您的 AssetBundles。当您使一个资源可寻址(Addressable)时,您可以使用该资源的地址从任何地方加载它。无论资源是在本地应用程序中可用还是存储在远程内容分发网络上,Addressable 系统都会定位并返回该资源。 您