- 接上篇笔记中的逐顶点光照继续整理
- 逐顶点的计算量发生在光与模型的顶点之间,
- 逐像素(逐片元)最终的颜色其实来自像素周围几个顶点插值结果
-顶点函数:
将上一篇中 vert(a2v f)函数中除 顶点位置 与 法线计算 之外的光方向、归一化的法线方向及漫反射光照以及最后的漫反射与环境光叠加全部移动到逐像素(逐片元)frag(v2f f)里来计算,如下:
//将光照计算过程移出顶点函数,放在片元函数中
v2f vert(a2v v) {
v2f f;
//顶点位置从模型空间转换到裁减空间也叫投影空间
f.position = mul(UNITY_MATRIX_MVP,v.vertex);
//法线计算
f.WorldNormalDir = mul(v.normal, (float3x3)_World2Object);
return f;
}
-片元函数:
//将计算过程放在片元中:逐像素光照
fixed4 frag(v2f f):SV_Target {
fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.rgb;
//光方向(_WorldSpaceLightPos0.xyz 世界空间中灯光位置就等于灯光方向)
fixed3 lightDir = normalize(_WorldSpaceLightPos0.xyz);

这篇博客主要介绍了如何在Unity的ShaderLab中实现逐像素的漫反射和环境光计算。作者通过调整顶点函数,将光方向、法线、漫反射光照和环境光的叠加计算移到片元函数中进行,详细阐述了这一过程。文中还附带了逐像素光照与逐顶点光照效果的对比截图,揭示了兰伯特光照模型在背面光照处理上的不足。最后,提供了完整的代码示例。
最低0.47元/天 解锁文章
2588

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



