学习笔记 整理来至《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 *