前言:
本文为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); |