首页 > 其他分享 >Shader入门精要笔记 - CH9_阴影投射,接收阴影

Shader入门精要笔记 - CH9_阴影投射,接收阴影

时间:2023-02-03 23:44:06浏览次数:45  
标签:MainTex Color Shader fixed3 worldNormal CH9 SHADOW 阴影

 

要点

1) 阴影投射一般直接引用unity自带的,比如: FallBack "VertexLit" FallBack "Transparent/Cutout/VertexLit" //针对半透明物体的情况 里面都包含名叫ShadowCaster的Pass来处理阴影投射   2) 接收阴影只需要用3个宏加几行代码就行了 SHADOW_COORDS(texIndex) TRANSFER_SHADOW(appdata) SHADOW_ATTENUATION(v2f)

 

主贴图漫反射(MainTex)+高光反射+阴影投射+接收阴影

Shader "My/Light/Shadow_CastAndRecv"
{
    Properties
    {
        _MainTex("Main Tex", 2D) = "white" {}
        _Color("Diffuse Color", Color) = (1, 1, 1, 1)

        _Specular("Specular", Color) = (1, 1, 1, 1) //高光反射颜色
        _Gloss("Gloss", Range(8.0, 256)) = 20 //高光区域大小
    }
    SubShader
    {
        Pass
        {
            Tags { "LightMode" = "ForwardBase" }

            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma multi_compile_fwdbase

            #include "Lighting.cginc"
            #include "AutoLight.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float3 normal : NORMAL; //顶点法线
                float2 texcoord : TEXCOORD0;
            };

            struct v2f
            {
                float4 pos : SV_POSITION;
                float2 uv : TEXCOORD0;
                float3 worldNormal : TEXCOORD1;
                float3 worldPos: TEXCOORD2;
                SHADOW_COORDS(3)
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;
            fixed4 _Color;
            fixed _Cutoff;

            fixed4 _Specular;
            float _Gloss;

            v2f vert(appdata v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.worldNormal = UnityObjectToWorldNormal(v.normal);
                o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;

                o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
                TRANSFER_SHADOW(o);
                return o;
            }

            fixed4 frag(v2f i) : SV_Target
            {
                fixed3 worldNormal = normalize(i.worldNormal);
                fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos)); //光方向(世界空间)

                fixed4 texColor = tex2D(_MainTex, i.uv);

                fixed3 albedo = texColor.rgb * _Color.rgb; //取贴图颜色作为漫反射颜色
                fixed3 ambientColor = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo; //环境光

                fixed3 lambert = max(0, dot(worldNormal, worldLightDir)); //表面法线和光线方向夹角的cos值成正比
                fixed3 diffuseColor = _LightColor0.rgb * albedo * lambert; //漫反射计算公式

                fixed3 viewDir = normalize(UnityWorldSpaceViewDir(i.worldPos)); //顶点到相机的观察方向向量

                fixed3 halfDir = normalize(worldLightDir + viewDir); // blinn模型引入的h向量
                fixed3 specularColor = _LightColor0.rgb * _Specular.rgb * pow(max(0, dot(worldNormal, halfDir)), _Gloss); // blinn模型高光反射计算公式(更亮, 高光区域更大)

                //fixed atten = 1.0; //衰减
                //fixed shadow = SHADOW_ATTENUATION(i); //接收阴影
                //atten *= showdow;

                UNITY_LIGHT_ATTENUATION(atten, i, i.worldPos); //光照衰减+接收阴影宏

                return fixed4(ambientColor + (diffuseColor + specularColor) * atten, 1);
            }
            ENDCG
        }
    }

    FallBack "VertexLit" //引用它的ShadowCaster的Pass
}

 

标签:MainTex,Color,Shader,fixed3,worldNormal,CH9,SHADOW,阴影
From: https://www.cnblogs.com/sailJs/p/17083575.html

相关文章

  • Shader入门精要笔记 - CH7.4_遮罩图在像素级别控制高光强度
    使用了遮罩图后,高光区域我们可以更精细的控制了。不然只能在整体上用Gloss参数调整高光区域 贴图漫反射(MainTex)+高光反射+法线贴图+遮罩图(SpecularMask)Shader"M......
  • 简单Shader应用
    //透明通道        Tags { "Queue" = "Transparent" "RenderType" = "Transparent" }        LOD 100        ZWrite Off      ......
  • Shader入门精要笔记 - CH7.3_渐变图控制漫反射
    左边是使用了前面提到的SpecularPerPixel,中间是没加渐变图时,右边是加了渐变图 高光+渐变图漫反射(RampTex)Shader"My/Tex/RampTexture"{Properties{......
  • Shader入门精要笔记 - CH7.2_法线贴图
    左侧为没用法线贴图,就视觉上没有凹凸感  法线贴图+高光+贴图漫反射(MainTex)Shader"My/Tex/NormalMapInTagentSpace"{Properties{_MainTex("......
  • shader调试
    简单点就是将要调试的值输出为颜色1) 比如:调试顶点值时,将顶点值输出为颜色Shader"My/VertexDebug"{Properties{_MainTex("Texture",2D)="whi......
  • Unity PBR Shader之衣服渲染之镭射
    一,关于镭射,Unity里已经提供好了公式,我们只需要调用就行,如下: 效果如下:转载请注明出处:https://www.cnblogs.com/jietian331/p/17062603.html......
  • Unity PBR Shader之衣服渲染之绒毛
    一,关于绒毛渲染原理,网上可参考的资料非常多,这里可参考:https://www.xbdev.net/directx3dx/specialX/Fur/index.php 二,渲染方案1.绒毛是立体的,但我们衣服是一层片,所以......
  • Unity PBR Shader之衣服渲染之丝袜,湿身
    一,丝袜渲染,其实相当简单了,在原有丝绸shader基础上增加半透明即可,效果图如下:  二,湿身,首先要模拟身体上有水流动的效果,可以用noise贴图配合ui动画经过一番处理生成雨水m......
  • Unity URP Shader之如何获取屏幕纹理
    UnityURP获取屏幕纹理方法不同于传统管线,GrabPass已经失效,而是已经提供了这张纹理,如下图: 这张纹理是在渲染完所有Opaque物体之后提供了,所以shader中要获取这张纹......
  • Unity PBR Shader之衣服渲染之丝绸
    丝绸silk、缎子satin、尼龙和聚酯一,观察效果一般来说,丝绸和其他合成纤维更光滑,因为它们是作为单根光滑细丝生产的。当它被编织时,它会产生一种具有各向异性镜面高光的织物......