Shader中的光照模型(二)

本系列文章系学习 唐福幸《Unity ShaderLab 新手宝典》的笔记,包含个人理解,如有错误欢迎批评指出

6.2 CG标准库函数

在shader中常常会使用到一些数学函数,而官方有提供了一个标准库,里面声明了很多数学函数,直接调用也更加节省性能,下面是一些常用的函数:
在这里插入图片描述

6.3 Half-Lambert光照模型

在6.1中学习了Lambert模型,但是它有个致命缺点:物体背光部分全黑(细节缺失,如果再加一盏灯,性能开销更大)

于是诞生了Half-Lambert光照模型:

计算公式为:
Cdiffuse = (Clight · Mdiffuse) [0.5 * (n · l) + 0.5]

  • Cdiffuse:物体的漫反射颜色
  • Clight:入射光线颜色
  • Mdiffuse:物体材质的漫反射颜色
  • n:物体的表面法线
  • l:物体指向的灯光方向向量

它没有把小于0的部分直接等于0,而是,先统一缩小0.5倍,再加上0.5,那么就使得光照有一个变暗的过程。

下面附上代码:

Shader "Chapter6/Half-Lambert"
{
    Properties
    {
        _MainCol ("Main Color", Color) = (1,1,1,1)
    }
    SubShader
    {
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"
            #include "UnityLightingCommon.cginc"

            struct v2f
            {
                float4 posi : SV_POSITION;
                fixed4 diff : COLOR0;
            };

            fixed4 _MainCol;

            v2f vert (appdata_base v)
            {
                v2f o;
                o.posi = UnityObjectToClipPos(v.vertex);

                //法线向量
                float3 n = UnityObjectToWorldNormal(v.normal);//(将法线从)模型空间转换成世界空间,已标准化处理

                //灯光方向向量
                fixed3 l = normalize(_WorldSpaceLightPos0.xyz);//获取世界空间平行光向量,标准化处理


                //计算漫反射
                fixed ndotl = dot(n,l);
                o.diff = _LightColor0 * _MainCol * (0.5 * ndotl + 0.5);//主要变化

                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                return i.diff;
            }
            ENDCG
        }
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值