UnityShader的基础光照模型解析

// Upgrade NOTE: replaced ‘_World2Object’ with ‘unity_WorldToObject’
// Upgrade NOTE: replaced ‘mul(UNITY_MATRIX_MVP,)’ with 'UnityObjectToClipPos()’

Shader “Unity Shaders Book/Chapter 6/Diffuse Vertex-Level” {
Properties {
_Diffuse (“Diffuse”, Color) = (1, 1, 1, 1)
}
SubShader {
Pass {
Tags { “LightMode”=“ForwardBase” } --只有正确定义LightMode 才能得到Unity内置的光照模型,例如 _LightColor0
LightMode 是Pass标签中的一种,它用于定义该Pass在Unity的光照流水线中的角色。

        CGPROGRAM
        
        #pragma vertex vert
        #pragma fragment frag
        
        #include "Lighting.cginc"
        
        fixed4 _Diffuse;
        
        struct a2v {
            float4 vertex : POSITION;
            float3 normal : NORMAL;
        };
        
        struct v2f {
            float4 pos : SV_POSITION;
            fixed3 color : COLOR;
        };
        
        v2f vert(a2v v) {
            v2f o;
            // Transform the vertex from object space to projection space
            o.pos = UnityObjectToClipPos(v.vertex); --Unity内置的模型*世界*投影矩阵 使得顶点位置从模型空间转换到裁剪空间中
            
            // Get ambient term
            fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz; --Unity内置变量,获取环境光信息
            
            // Transform the normal from object space to world space
            fixed3 worldNormal = normalize(mul(v.normal, (float3x3)unity_WorldToObject)); --把在a2v中获取的模型空间中的法线方向转换到世界空间中
            // Get the light direction in world space
            fixed3 worldLight = normalize(_WorldSpaceLightPos0.xyz); --获取世界空间中的光源方向
            // Compute diffuse term
            fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * saturate(dot(worldNormal, worldLight)); --dot点乘
            
            o.color = ambient + diffuse;
            
            return o;
        }
        
        fixed4 frag(v2f i) : SV_Target {
            return fixed4(i.color, 1.0);
        }
        
        ENDCG
    }
}
FallBack "Diffuse"

}
Shader “Unlit/TestTwo” //逐片面光照渲染
{
Properties
{
_Diffuse(“MainColor”,Color) =(1,1,1,1)
}
SubShader
{
Tags {“LightMode”=“ForwardBase” } --只有正确定义LightMode 才能得到Unity内置的光照模型,例如 _LightColor0
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include “Lighting.cginc” --引用内置的光照库

        fixed4 _Diffuse;

        struct appdata
        {
            float4 vertex : POSITION; --顶点
            float3 normal : NORMAL; --法线
        };

        struct v2f
        {
            float4 pos : SV_POSITION; --传入到片面着色器的顶点信息
            float3 WorldNormal : TEXCOORD0; --传入到片面着色器的法线信息
        };
        
        v2f vert (appdata v)
        {
            v2f o;
            o.pos = UnityObjectToClipPos(v.vertex); //将模型的顶点转换到世界坐标中
            o.WorldNormal = mul (v.normal,(fixed3x3)unity_WorldToObject); --把模型坐标系下得法线转换到世界坐标系下
            return o;
        }
        
        fixed4 frag (v2f i) : SV_Target
        {

fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz; //获取当前场景中的环境光信息
fixed3 WorldLight = normalize(_WorldSpaceLightPos0.xyz); --将世界坐标系下的主光源的位置信息归一化
fixed3 Normal = normalize(i.WorldNormal); --将世界坐标系的模型顶点的法线归一化
fixed3 lightinfo = _LightColor0.rgb * _Diffuse.rgb * saturate(dot(WorldLight,Normal)); --dot点乘,saturate (x)将x值限制在0-1之间
fixed3 color = lightinfo + ambient;
return fixed4 (color ,1.0) ;
}
ENDCG
}
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值