untiy 3d ShaderLab_第9章_1_平面阴影(三) 点光源对平面的投影
来源:互联网 发布:每次人口普查的数据 编辑:程序博客网 时间:2024/05/29 04:45
9.3 阴影的淡出
9.3.1 有效利用计算平面阴影过程中的数据
9.3.2潜在的问题
这个方法还有一个显而易见的问题,那就是物体本身是立体的,不是一个平面,因此这个计算前后的点的距离是包括物体本身厚度的,这个厚度就会表现在阴影上。要解决这个问题,我们可以先把物体变换到灯光空间,使用_World2Light矩阵沿着灯光方向把物体压扁,然后投射物体,这样计算出来的阴影衰减就不会包括物体的厚度了。
9.3.1 有效利用计算平面阴影过程中的数据
一般情况下,比如用Shadow Mapping和Shadow Volumes计算阴影的衰减是比较困难的,但是在此例中,我们己经知道投射阴影物体的顶点在计算前和计算后的位置,根据这两个位置的距离,我们还是可以考虑计算一下阴影的衰减问题的。
<pre name="code" class="csharp">Shader "Tut/Shadow/PlanarShadow_3" {Properties{_Intensity("atten",range(1,16))=1}SubShader {pass { Tags { "LightMode" = "ForwardBase" }Material{Diffuse(1,1,1,1)}Lighting On}//pass { Tags { "LightMode" = "ForwardBase" } Cull FrontBlend DstColor SrcColorOffset -1,-1CGPROGRAM#pragma vertex vert #pragma fragment frag#include "UnityCG.cginc"float4x4 _World2Ground;float4x4 _Ground2World;float _Intensity;struct v2f{float4 pos:SV_POSITION;float atten:TEXCOORD0;};v2f vert(float4 vertex: POSITION){v2f o;float3 litDir;litDir=normalize(WorldSpaceLightDir(vertex)); litDir=mul(_World2Ground,float4(litDir,0)).xyz;float4 vt;vt= mul(_Object2World, vertex);vt=mul(_World2Ground,vt);vt.xz=vt.xz-(vt.y/litDir.y)*litDir.xz;vt.y=0;vt=mul(_Ground2World,vt);//back to worldvt=mul(_World2Object,vt);o.pos=mul(UNITY_MATRIX_MVP, vt);o.atten=distance(vertex,vt)/_Intensity;return o;} float4 frag(v2f i) : COLOR {return smoothstep(0,1,i.atten/2);} ENDCG }//pass { Tags { "LightMode" = "ForwardAdd" } Cull FrontBlend DstColor SrcColorOffset -2,-1CGPROGRAM#pragma vertex vert #pragma fragment frag#include "UnityCG.cginc"float4x4 _World2Ground;float4x4 _Ground2World;float _Intensity;struct v2f{float4 pos:SV_POSITION;float atten:TEXCOORD0;};v2f vert(float4 vertex:POSITION){v2f o;float3 litDir;litDir=normalize(WorldSpaceLightDir(vertex)); litDir=mul(_World2Ground,float4(litDir,0)).xyz;float4 vt;vt= mul(_Object2World, vertex);vt=mul(_World2Ground,vt);vt.xz=vt.xz-(vt.y/litDir.y)*litDir.xz;vt.y=0;vt=mul(_Ground2World,vt);//back to worldvt=mul(_World2Object,vt);o.pos= mul(UNITY_MATRIX_MVP, vt);o.atten=distance(vertex,vt)/_Intensity;return o;} float4 frag(v2f i) : COLOR {return smoothstep(0,1,i.atten*i.atten);} ENDCG } }}
9.3.2潜在的问题
这个方法还有一个显而易见的问题,那就是物体本身是立体的,不是一个平面,因此这个计算前后的点的距离是包括物体本身厚度的,这个厚度就会表现在阴影上。要解决这个问题,我们可以先把物体变换到灯光空间,使用_World2Light矩阵沿着灯光方向把物体压扁,然后投射物体,这样计算出来的阴影衰减就不会包括物体的厚度了。
0 0
- untiy 3d ShaderLab_第9章_1_平面阴影(三) 点光源对平面的投影
- untiy 3d ShaderLab_第9章_1_平面阴影(二) 点光源对平面的投影
- untiy 3d ShaderLab_第9章_3_球体阴影(三) 点光源对球体的投影
- untiy 3d ShaderLab_第9章_1_平面阴影(一)
- untiy 3d ShaderLab_第9章_2_球体阴影(一) 平行光对球体的投影
- untiy 3d ShaderLab_第9章_2_球体阴影(二) 阴影的淡入/淡出
- untiy 3d ShaderLab_第6章_VertexLit渲染路径_1_顶点照明
- untiy 3d ShaderLab_第7章_ Forward渲染路径_2_Forward渲染路径下的重要光源
- untiy 3d ShaderLab_第7章_ Forward渲染路径_3_重要光源在ForwardAdd内的执行
- untiy 3d ShaderLab_第8章_4_ 单光照贴图在Deferred 渲染路径下的实时阴影
- untiy 3d ShaderLab_第6章_VertexLit渲染路径_2_顶点照明和Unity存放光源的第一种方式
- untiy 3d ShaderLab_第6章_VertexLit渲染路径_3_顶点照明和Unity存放光源的第二种方式
- untiy 3d ShaderLab_第6章_VertexLit渲染路径_4_顶点照明和Unity存放光源的第三种方式
- untiy 3d ShaderLab_第6章_VertexLit渲染路径_4_顶点照明和Unity存放光源的第三种方式
- untiy 3d ShaderLab_第3章_Shader(着色器)中用到的各种空间概念
- untiy 3d ShaderLab_第4章_基本的光照模型
- untiy 3d ShaderLab_第8章_ 基于光照贴图的烘焙照明
- untiy 3d ShaderLab_第8章_ 基于光照贴图的烘焙照明
- 多线程中lock用法的经典实例
- UVA 1262
- 剑指offer--面试题46:求1+2+3+...+n
- 小娴的男友小旭不幸患了一种怪病,这种怪病吞噬了他的大部分记忆,同时让他突然间不会书写符合正确语序的英文。神奇的是,虽然他写出的句子看上去杂乱无章,不过经过仔细分析可以发现,如果把单词的顺序倒过来,语法
- shell编程之BASH_BUILTINS
- untiy 3d ShaderLab_第9章_1_平面阴影(三) 点光源对平面的投影
- 华为oj之计算字符个数
- play框架自定义插件plugin拦截器
- [从头学数学] 第282节 [计算几何] 相邻边和相邻点
- UIViewController添加UICollectionView控件顶端出现留白的解决办法
- Min-height 最小高度兼容ie6
- 第55课: 在线广告点击流处理代码的分析和实现
- Android--RxJava之并发处理(SerializedSubject)
- 剑指offer--面试题47:不用加减乘除做加法