代码编织梦想

        害,今天就把阴影看了吧,和上一篇的主题不太搭调,就新开了一个文章,哈哈哈哈

ShadowMap的原理

        突然翻上半年听games202课程闫老师讲的ShadowMap的知识点了。

        大致就是说从光源的方向看物体生成一张阴影映射纹理(shadowMap)

        差不多长这个样子 

然后捏,我们摄像机看到的一些物体在世界坐标下的位置在shadowmap中查找,如果深度大于shadowMap中的呢,那肯定就是在阴影中了啊!反正大概就是个这么意思了啦,可能不是很准确。

阴影在Unity中

        在unity中物体可以选择是否投射阴影或者是否接收阴影这种选择,如果你选择接收阴影,那你的物体就得采样shadowmap,如果你选择投射阴影,那你这个物体就要加入shadowmap的计算中去。

        投射阴影

        在unity中专门用了一个pass并且LightmModel 为ShadowCaster来投射阴影,当我们使用shadowMap的这个阴影技术的时候,就会启动这个pass。这个pass很多时候都在FallBack语句中,然后一直回调,直到调用到vertexLit。如果是透明物体的阴影,你就要使用Transparent/Cutout/VertexLit。当然你也可以自己在shader里面写这个pass。

        接收阴影

        阴影三剑客,放进shader里面就完事了,不用想那么多 

        打开帧调试器看看

从摄像机的deepthtexture

ShadowMap

Scene视角

补充,顶点动画下的投射阴影

        如果顶点动画的状态下投射阴影,阴影的形状是不会改变的,所以我们要自定义投射阴影的pass

        直接上《UnityShader入门精要的代码》

        

Shader "Unity Shaders Book/Chapter 11/Vertex Animation With Shadow" {
	Properties {
		_MainTex ("Main Tex", 2D) = "white" {}
		_Color ("Color Tint", Color) = (1, 1, 1, 1)
		_Magnitude ("Distortion Magnitude", Float) = 1
 		_Frequency ("Distortion Frequency", Float) = 1
 		_InvWaveLength ("Distortion Inverse Wave Length", Float) = 10
 		_Speed ("Speed", Float) = 0.5
	}
	SubShader {
		// Need to disable batching because of the vertex animation
		Tags {"DisableBatching"="True"}
		
		Pass {
			Tags { "LightMode"="ForwardBase" }
			
			Cull Off
			
			CGPROGRAM  
			#pragma vertex vert 
			#pragma fragment frag
			
			#include "UnityCG.cginc" 
			
			sampler2D _MainTex;
			float4 _MainTex_ST;
			fixed4 _Color;
			float _Magnitude;
			float _Frequency;
			float _InvWaveLength;
			float _Speed;
			
			struct a2v {
			    float4 vertex : POSITION;
			    float4 texcoord : TEXCOORD0;
			};
			
			struct v2f {
			    float4 pos : SV_POSITION;
			    float2 uv : TEXCOORD0;
			};
			
			v2f vert(a2v v) {
				v2f o;
				
				float4 offset;
				offset.yzw = float3(0.0, 0.0, 0.0);
				offset.x = sin(_Frequency * _Time.y + v.vertex.x * _InvWaveLength + v.vertex.y * _InvWaveLength + v.vertex.z * _InvWaveLength) * _Magnitude;
				o.pos = UnityObjectToClipPos(v.vertex + offset);
				
				o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
				o.uv +=  float2(0.0, _Time.y * _Speed);
				
				return o;
			}
			
			fixed4 frag(v2f i) : SV_Target {
				fixed4 c = tex2D(_MainTex, i.uv);
				c.rgb *= _Color.rgb;
				
				return c;
			} 
			
			ENDCG
		}
		
		// Pass to render object as a shadow caster
		Pass {
			Tags { "LightMode" = "ShadowCaster" }
			
			CGPROGRAM
			
			#pragma vertex vert
			#pragma fragment frag
			
			#pragma multi_compile_shadowcaster
			
			#include "UnityCG.cginc"
			
			float _Magnitude;
			float _Frequency;
			float _InvWaveLength;
			float _Speed;
			
			struct v2f { 
			    V2F_SHADOW_CASTER;
			};
			
			v2f vert(appdata_base v) {
				v2f o;
				
				float4 offset;
				offset.yzw = float3(0.0, 0.0, 0.0);
				offset.x = sin(_Frequency * _Time.y + v.vertex.x * _InvWaveLength + v.vertex.y * _InvWaveLength + v.vertex.z * _InvWaveLength) * _Magnitude;
				v.vertex = v.vertex + offset;

				TRANSFER_SHADOW_CASTER_NORMALOFFSET(o)
				
				return o;
			}
			
			fixed4 frag(v2f i) : SV_Target {
			    SHADOW_CASTER_FRAGMENT(i)
			}
			ENDCG
		}
	}
	FallBack "VertexLit"
}

可以看到,我们在BasePass中改变了顶点着色器中 面板点的位置,在ShadowCasterPass中也要自定义改变顶点的位置,并加上投射阴影所需要的宏,如果不自定义阴影的话,默认调用生成的阴影是不会动的。

不好搞视频啊

就这样,后续再补充

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_45437273/article/details/127155381

unity阴影制作-爱代码爱编程

一、使用Camera和Render Texture在加上Plane制作 二、原理:Camera照到的物体显示在Render Texture上,然后设置Plane的模型材质 三、教程笔记 1、首先创建新的Camera、Render Texture和Plane 2、把Render Texture放到Camera的Target Texture上,和Plane上,

Unity shader阴影-爱代码爱编程

Unity shader阴影 参考书籍:《Unity Shader入门精要》 阴影是如何实现的   在实时渲染中,我们最常使用的是一种名为Shadow Map的技术。这种技术的原理是将摄像机放到与光源重合的位置上,那么场景中该光源的阴影区域就是那些摄像机看不到的地方。Unity使用的就是这种技术。 在前向渲染路径中,如果场景中最重要的

使用UnityShader实现2D阴影效果-爱代码爱编程

使用UnityShader实现2D阴影效果 实现原理------------------------------------------------------------------------------------ 使用2个Pass,第二个Pass渲染2D角色,第一个Pass渲染阴影,使用矩阵的旋转变换和平移变换控制阴影的旋转和偏移,修改

unity3d+android+实时阴影,Unity3D 移动端简单阴影的实现-爱代码爱编程

本篇文章给大家介绍下移动端简单阴影的实现,一般移动端受到机能的限制,最多只在脚下绘制一团小黑影来代表影子,实时渲染是基本不可能的。 不过还有一种方法可以实现影子,而且还不输于渲染出来的影子。思路其实很简单,稍微提一下:就是用一个正交相机捕捉需要影子的物体,再将其捕捉产生的图片通过Shader的处理,放到地上的一个面片上,从而产生一个黑影。 具体代码

Unity阴影类设置-爱代码爱编程

目录 1、阴影设置(1)更换SkyBox(2)节省资源——影子渲染阴影渲染距离远处阴影虚化平滑阴影SoftShadows阴影基本噪声NormalBias 1、阴影设置 (1)更换SkyBox 在Window——Rendering——Lighting设置中的Environment更改Skybox材质 (2)节省资源——影子渲染 阴影渲染距

Unity 的阴影实现原理-爱代码爱编程

目前学习到的unity 渲染阴影的两种方式. 下面情况默认是 前向渲染路径,场景中平行光开启了阴影 方式 原理 备注 ShadowMap 把相机放到光源的位置,那么场景中该光源的阴影区域就是那些相机看不到的位置 得到的是:场景中距离光源最近的表面位置(深度信息) unity中专门的pass 单独处理阴影映射纹理。 pass的LightMo

Unity Shader 平面阴影-爱代码爱编程

Shader "Custom/PlanarShadow" { Properties { _MainTex("Texture", 2D) = "white" {} _ShadowInvLen("ShadowInvLen", float) = 6.36 //0.4449261 _ShadowFalloff("ShadowFalloff", f

unity 阴影——阴影平坠(shadow pancaking)-爱代码爱编程

阴影平坠(Shadow pancaking) 为了减少阴影暗斑(Shadow acne)Unity采取了一种叫做阴影平坠(Shadow pancaking)的技术,它的思路就是减少沿光照方向渲染阴影贴图时使用的光照空间范围

ar unity制作阴影_ar创建影子 导出adk也有影子的吗-爱代码爱编程

文章目录 一、创建camera二、创建render texture接收阴影三、hierarchy中创建plan四、设置层级五、 调整摄像机位置六、将plan和camera都放到模型的下面 一、创建