前言:
本文为Shader学习的第四部分,关于shader的格式梳理。
一、基本模型
n: normal 法线方向
l: light 光线方向(该模型中为指向光源的方向而非入射方向)
v: view 视线方向
r: reflect 反射方向
二、各部分需要用到的变量
顶点坐标 (模型空间) | 法线方向 normal | 光源方向 light | 反射方向 reflect | 视线方向 view | |
ambient | × | × | × | × | × |
diffuse | √ | √ | √ | × | × |
specular | √ | √ | √ | √ | √ |
三、如何获得各部分的变量
变量 | 方法 | 说明 | |
顶点坐标 (裁剪空间) | o.pos | UnityObjectToClipPos(v.vertex); mul(UNITY_MATRIX_MVP, v.vertex); | 将模型的顶点坐标从模型空间通过MVP变换转到裁剪空间 |
顶点坐标 (世界空间) | o.worldPos | mul(unity_ObjectToWorld, v.vertex).xyz; | 将模型的顶点坐标从模型空间转到世界空间 |
法线方向 (世界空间) | o.worldNormal | UnityObjectToWorldNormal(v.normal); | 将模型的法线方向从模型空间转到世界空间 |
光源方向 (世界空间) | worldLightDir | normalize(_WorldSpaceLightPos0.xyz); | 获取世界空间下的光源方向,仅限于单个且平行光的条件下 |
反射方向 (世界空间) | reflect | normalize(reflect(-worldLightDir, worldNormal)); | 通过reflect函数和逆光源方向、世界空间下的法线方向获取 世界空间下的反射光方向 |
视线方向 (世界空间) | view | normalize(_WorldSpaceCameraPos.xyz - i.worldPos.xyz); | 通过世界空间下的相机坐标减顶点的世界空间坐标获取视线 方向 |
四、汇总与合并
ambient | fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz; | ||
diffuse |
| ||
specular |
| ||
summary | return (ambient + diffuse + specular, 1.0); |