Unity ShaderLab 基础五(高光反射光照)

这篇博客是学习《Unity Shader入门精要》的笔记,主要探讨Unity中的高光反射光照。文章介绍了Clight、Mspecular和V等概念,以及如何通过CG提供的reflect函数计算反射方向。内容还涉及到逐顶点光照和逐像素光照的区别,尤其是逐顶点光照导致的高光不平滑问题。最后,文章提到了Blinn-Phong光照模型,并展示了使用UnityCG.cginc内置函数改写该模型的Shader代码。
摘要由CSDN通过智能技术生成

学习笔记  整理来至《Unity Shader入门精要》 

公式如下:

Clight:入射光线的颜色和强度

Mspecular:材质的高光反射系数

V:视角方向

r:反射方向,可以有表面发现n和光源方向计算得到

CG提供了计算反射方向的函数 reflect(i,n)

参数   i:入射方向 n:法线方向 

描述:当给定 射入方向i和法线方向n时,reflect函数可以返回反射方向,下图关系图: 

 

逐顶点光照(SpecularVertex): 

//高光反射逐顶点(SpecularVertex)
Shader "SpecularVerrex" {
    Properties{
        _Diffuse("Diffuse",Color)=(1,1,1,1)     //漫反射颜色
        _Specular("Specular",Color)=(1,1,1,1)   //高光反射颜色
        _Gloss("Gloss",Range(8.0,256))=20       //高光区域的大小
    }
    SubShader {
        pass {
            Tags{"LightMode"="ForwardBase"}
            //只有定义了LightMode才能得到一些Unity的内置光照变量
            CGPROGRAM                  //-------CG------
            #pragma vertex vert        //声明顶点着色器
            #pragma fargment farg      //声明片元着色器
            #include "Lighting.cginc"  //引用内置文件

            fixed4 _Diffuse;           //定义Properties参数
            fixed4 _Specular;
            float  _Gloss;

            struct a2v {               //定义顶点着色器输入结构体
                float4 vertex : POSITION;
                //把模型空间下的顶点坐标填充给vertex
                float3 normal : NORMAL;
                //把模型空间下的顶点法线填充给normal
            };
            struct v2f {               //定义顶点着色器输出结构体
                float4 pos : SV_POSITION;
                fixed3 color : COLOR;
            };        
            //顶点着色器的输出结构体同时也是片元着色器的输入结构
            v2f vert(a2v v){           //定义顶点着色器
                v2f o;                 //定义返回值o
                o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
                //通过内置矩阵把顶点位置从模型空间转换到裁剪空间
                fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;
                //通过内置变换获得环境光(想要获得正确的值需要定义合适的LightMode标签)
                fixed3 worldNormal = normalize(mul(v.normal,(float3x3)_World2Object));
                //顶点法线从模型空间转换到世界空间,并归一化处理
                fixed3 worldLinghtDir = normalize(_WorldSpaceLightPos0.xyz);
                //获得世界空间光的方向,并归一化处理
                fixed3 diffuse = _LightColor0.rgb * 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值