建设网站的申请,网站的联系我们怎么做,济南高新网站建设,wordpress怎样安装1、让透明度测试Shader投射阴影
#xff08;1#xff09;同样我们使用FallBack的形式投射阴影#xff0c;但是需要注意的是#xff0c;FallBack的内容为#xff1a;Transparent / Cutout / VertexLit#xff0c;该默认Shader中会把裁剪后的物体深度信息写入到 阴影映射纹…1、让透明度测试Shader投射阴影
1同样我们使用FallBack的形式投射阴影但是需要注意的是FallBack的内容为Transparent / Cutout / VertexLit该默认Shader中会把裁剪后的物体深度信息写入到 阴影映射纹理和摄像机深度图中 注意使用该默认Shader计算投射阴影时需要使用_Cutwoff属性 和 _Color属性来进行相关计算因此我们必须保证我们的Shader当中有名为_Cutoff的阈值属性 和 _Color的漫反射颜色属性否则无法得到正确阴影结果
2为了得到正确的阴影效果我们需要将该物体的Cast Shadows投射阴影属性设置为Two Sided双面强制让Unity计算阴影隐射纹理时计算所有面的深度信息。因为如果不设置默认将物体渲染到阴影隐射纹理和摄像机深度图时只会考虑物体的正面背对光源的面不会参与计算左图设置为双面后即可参与计算得到正确的结果右图。 3、让透明度测试Shader接收阴影
主要分5步骤 1编译指令#pragma multi_compile_fwdbase 用于帮助我们编译所有变体 并且保证衰减相关光照变量能够正确赋值到对应的内置变量中 2包含内置文件 #include AutoLight.cginc 3结构体中声明阴影坐标宏SHADOW_COORDS(n) n为下一个可用的插值寄存器的索引值结构体前面有几个TEXCOORD就填几 4坐标转换宏TRANSFER_SHADOW(o); 5Unity光照衰减计算宏UNITY_LIGHT_ATTENUATION(atten, v2f结构体, 顶点世界坐标位置);
Shader ShaderProj/4/TranparentTest_Both
{Properties{_MainTex(MainTex, 2D) {}_Color(MainColor, Color) (1,1,1,1)_SpecularColor(SpecularColor, Color) (1,1,1,1)_SpecularNum(SpecularNum, Range(0,20)) 15_Cutoff(CutOff, Range(0,1)) 0 // 透明度测试阈值}SubShader{Tags{QueueAlphaTestIgnoreProjectorTrueRenderTypeTransparentCutout}Pass{Tags { LightModeForwardBase }// 关闭剔除正面背面都被渲染Cull OffCGPROGRAM#pragma vertex vert#pragma fragment frag#pragma multi_compile_fwdbase#include UnityCG.cginc#include Lighting.cginc#include AutoLight.cgincsampler2D _MainTex;float4 _MainTex_ST;fixed4 _Color;fixed4 _SpecularColor;float _SpecularNum;fixed _Cutoff;struct v2f{float4 pos:SV_POSITION;float2 uv:TEXCOORD0;float3 wNormal:NORMAL;float3 wPos:TEXCOORD01;SHADOW_COORDS(2)};fixed3 getLambertColor(float3 normal, float3 lightDir, fixed3 albedo){fixed3 color _LightColor0 * albedo * max(0, dot(lightDir, normal));return color;}fixed3 getSpecularColor(float3 worldPos, float3 normal, float3 lightDir){//float3 viewDir normalize(_WorldSpaceCameraPos - worldPos);float3 viewDir normalize(UnityWorldSpaceViewDir(worldPos));float3 halfAngle normalize(viewDir lightDir);fixed3 color _LightColor0 * _SpecularColor * pow(max(0, dot(normal, halfAngle)), _SpecularNum);return color;}v2f vert (appdata_base v){v2f data;data.pos UnityObjectToClipPos(v.vertex);data.wNormal UnityObjectToWorldNormal(v.normal);data.wPos mul(unity_ObjectToWorld, v.vertex);data.uv TRANSFORM_TEX(v.texcoord, _MainTex);//data.uv v.texcoord.xy * _MainTex_ST.xy _MainTex_ST.zw;TRANSFER_SHADOW(data)return data;}fixed4 frag (v2f i) : SV_Target{// 透明度测试fixed4 texColor tex2D(_MainTex, i.uv);clip(texColor.a - _Cutoff);//计算光照衰减和阴影衰减的宏UNITY_LIGHT_ATTENUATION(atten, i, i.wPos)fixed3 albedo texColor.rgb * _Color.rgb; float3 lightDir normalize(_WorldSpaceLightPos0);fixed3 lambertColor getLambertColor(i.wNormal, lightDir, albedo);fixed3 specularColor getSpecularColor(i.wPos, i.wNormal, lightDir);fixed3 color (lambertColor specularColor) * atten UNITY_LIGHTMODEL_AMBIENT.rgb * albedo;return fixed4(color, 1);}ENDCG}}Fallback Transparent/Cutout/VertexLit
}3、透明度混合处理阴影
根据透明度测试的思路我们如果想要物体产生阴影效果无非就两步 1投射阴影 在FallBack中关联内置的对应ShaderTransparent/VertexLit 2接受阴影 在Shader中书写计算阴影衰减值的相关代码 因此对于透明度混合的Shader也会使用同样的思路去制作
但是由于透明度混合需要关闭深度写入而阴影相关的处理需要用到深度值参与计算因此Unity中从性能方面考虑要计算半透明物体的的阴影表现效果是相对复杂的所有的内置半透明Shader都不会产生阴影效果比如 Transparent/ VertexLit 因此 2 - 1.透明混合Shader想要 投射阴影时 不管你在FallBack中写入哪种自带的半透明混合Shader都不会有投射阴影的效果因为深度不会写入
2 - 2.透明混合Shader想要 接受阴影时 Unity内置关于阴影接收计算的相关宏不会计算处理透明混合Shader【混合因子 设置为半透明效果(Blend SrcAlpha OneMinusSrcAlpha)的Shader】 因为透明混合物体的深度值和遮挡关系无法直接用传统的深度缓冲和阴影贴图来处理
结论Unity中不会直接为透明度混合Shader处理阴影
4、透明度混合强制生成阴影
在FallBack中设置一个非透明Shader比如VertexLit、Diffuse等用其中的灯光模式设置为阴影投射的渲染通道来参与阴影映射纹理的计算把该物体当成一个实体物体处理但是这种效果并不真实不建议使用