笔记都是照着“Unity Shader入门精要”摘抄的,为以后想要复习实现方便。
标准光照模型


上面是考虑光照时抽象出的背景情况,光照模型Lighting Model就是用于根据材质属性、光源信息等得出在某个观察方向的出射度的过程。也就是着色(Shading)过程。
标准光照模型使用自发光、环境光、高光反射和漫反射来叠加计算出摄像头看到的物体的光(颜色)
环境光和自发光
环境光是一个全局变量,在Unity中设置,
在Shader中可以通过UNITY_LIGHTMODEL_AMBIENT获取。
自发光暂时不考虑:
考虑直接自发光很简单,直接在片元着色器最后的颜色输出中添加即可,
考虑间接自发光较难,因为需要计算其它物体对自发光物体光源的反射。
漫反射光照
基本光照模型中,漫反射光照的计算公式:

入射光线的颜色和强度:clightc_{light}clight,
材质的漫反射系数:mdiffusem_{diffuse}mdiffuse,
表面法线:n^\hat{n}n^,
光源方向:III。
逐顶点光照
Shader "Custom/DiffuseVertex"
{
Properties{
_Diffuse ("Diffuse", Color) = (1, 1, 1, 1)
}
SubShader{
Pass{
Tags{
"LightMode" = "ForwardBase"}//定义了正确的LightMode,才能得到Unity内置的光照变量
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "Lighting.cginc" //使用内置库文件
fixed4 _Diffuse; //得到材质的漫反射属性,需要使用Properties中声明的属性,要定义一个类型相通的同名变量
//顶点、片元着色器的输入输出结构体
struct a2v{
float4 vertex : POSITION;
float3 normal : NORMAL;
};
struct v2f{
float4 pos : SV_POSITION;
fixed3 color : COLOR;
};
v2f vert(a2v v){
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz; //获取环境光
fixed3 worldNormal =

本文详细介绍了Unity Shader中的光照模型,包括环境光、自发光、漫反射和高光反射等概念,并通过具体代码实例展示了逐顶点光照和逐片元光照的实现方法,最后讲解了如何使用Unity内置函数优化光照计算。
最低0.47元/天 解锁文章
252

被折叠的 条评论
为什么被折叠?



