博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Shader】shader接收和产生阴影的条件以及必需代码
阅读量:4088 次
发布时间:2019-05-25

本文共 3071 字,大约阅读时间需要 10 分钟。

【向其他物体投射阴影】虽然当前的Shader中不存在Tags是”LightMode”=”ShadowCaster”的pass,但是只要FallBack “Specular”中存在就可以实现向其他物体投射阴影,前提是光源开启了阴影


【接收其他物体的阴影】

1.引入#include “AutoLight.cginc”,因为关于阴影计算的宏都在这里
2.在v2f结构体中加入SHADOW_COORDS(3),这里的3只是TEXCOORD的编号而已,因为前面使用了012
3.在vert着色器return之前不要忘了计算TRANSFER_SHADOW(o);的值。这里需要注意的是在v2f的结构体中SV_POSTION类型变量的名字必须是pos(小写的),因为这个func把o传递进去之后首先调用的就是o.pos,如果你没有pos那么就会报错了
4.在frag着色器中计算阴影的强度fixed shadow = SHADOW_ATTENUATION(i);
最后在frag返回颜色之前,将shadow的值与颜色相乘即可得到阴影

Shader "Unlit/Blinn-phong"{    Properties    {        _MainTex ("Texture", 2D) = "white" {}        _SpecularColor("SpecularColor",Color )=(1,1,1,1)        _SpecularGloss("Gloss",Range(8.0,256)) = 20        _Diffuse ("Diffuse", Color) = (1, 1, 1, 1)    }    SubShader    {        Tags { "RenderType"="Opaque" }        Pass        {            Tags { "LightMode"="ForwardBase" }            CGPROGRAM            #pragma vertex vert            #pragma fragment frag            #pragma multi_compile_fwdbase            #include "UnityCG.cginc"            #include "Lighting.cginc"             #include "AutoLight.cginc"            struct a2v            {                float4 vertex : POSITION;                float2 uv : TEXCOORD0;                float3 normal:NORMAL;            };            struct v2f            {                float2 uv : TEXCOORD0;                float4 pos : SV_POSITION;                float3 worldNormal :TEXCOORD1;                float3 worldPos :TEXCOORD2;                SHADOW_COORDS(3)            };            sampler2D _MainTex;            float4 _MainTex_ST;            float4 _SpecularColor;            float  _SpecularGloss;            float4  _Diffuse;            v2f vert (a2v v)            {                v2f o;                o.uv = TRANSFORM_TEX(v.uv,_MainTex);                o.pos = UnityObjectToClipPos(v.vertex);                o.worldNormal = UnityObjectToWorldNormal(v.normal);                o.worldPos  = mul(unity_ObjectToWorld,v.vertex).xyz;                TRANSFER_SHADOW(o);                return o;            }            fixed4 frag (v2f i) : SV_Target            {                // 1.ambientColor                float3  ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;                // 2.diffuseColor                float3 N =  normalize(i.worldNormal);                float3 L = normalize(_WorldSpaceLightPos0.xyz);                float3 diffuseColor = _LightColor0.rgb * _Diffuse.rgb * max(0.0,dot(N,L));                // 3.specularColor                float3  V = normalize(_WorldSpaceCameraPos.xyz - i.worldPos.xyz);                // H替代了Phong中的reflectDic = normalize(reflect(-L,N));                float3 H = normalize(L+V);                // 这里需要注意的是计算高光反射的时候使用的是【半角向量 H】和法向量的点积                float3 specularColor = _LightColor0.rgb * _SpecularColor.rgb * pow(max(0,dot(H,N)),_SpecularGloss);                fixed  shadow = SHADOW_ATTENUATION(i);                fixed4 col =  tex2D(_MainTex,i.uv) * float4 ((ambient+diffuseColor+specularColor) * shadow,1);                return col;            }            ENDCG        }    }    FallBack "Specular"}

转载地址:http://cdkii.baihongyu.com/

你可能感兴趣的文章
c# 如何调用win8自带的屏幕键盘(非osk.exe)
查看>>
build/envsetup.sh 简介
查看>>
linux怎么切换到root里面?
查看>>
编译Android4.0源码时常见错误及解决办法
查看>>
Android 源码编译make的错误处理
查看>>
启用SELinux时遇到的问题
查看>>
virbr0 虚拟网卡卸载方法
查看>>
No devices detected. Fatal server error: no screens found
查看>>
新版本的linux如何生成xorg.conf
查看>>
Centos 6.0_x86-64 终于成功安装官方显卡驱动
查看>>
Linux基础教程:CentOS卸载KDE桌面
查看>>
read humor_campus
查看>>
my read work
查看>>
db db2 base / instance database tablespace container
查看>>
db db2_monitorTool IBM Rational Performace Tester
查看>>
Linux +Win LAMPP Tools XAMPP 1.7.3 / 5.6.3
查看>>
OS + Linux Disk disk lvm / disk partition / disk mount / disk io
查看>>
net TCP/IP / TIME_WAIT / tcpip / iperf / cain
查看>>
webServer kzserver/1.0.0
查看>>
OS + Unix IBM Aix basic / topas / nmon / filemon / vmstat / iostat / sysstat/sar
查看>>