Shader(4):模型总结

发布于:2023-02-07 ⋅ 阅读:(512) ⋅ 点赞:(0)

前言:

本文为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

fixed3 diffuse = _LightColor.rgb * _Color.rgb * Lambert;

float Lambert = saturate(n * l) = max(0, n * l);

fixed3 diffuse = _LightColor.rgb * _Diffuse.rgb * halfLambert;

float halfLambert = 0.5 * (n * l) + 0.5;

specular

fixed3 specular = _LightColor.rgb * _Specular.rgb * Phong;

float Phong = v * r;

fixed3 specular = _LightColor.rgb * _Specular.rgb * BlinnPhong;

float BlinnPhong = n * h;

h = normalize(v + l);

summary

return (ambient + diffuse + specular, 1.0);


网站公告

今日签到

点亮在社区的每一天
去签到