UnityShader多灯光

截屏2021-02-03 下午10.28.38.png

2、添加一个DL(平行光),没有直接反应。改变混合 Blend One One,和Tags{"LightMode" = "ForwardAdd"},可以得到附加光源得效果

3、如何渲染?不透明第一次渲染对象时,会记录像素到摄像机最近表面距离(z缓冲),如果下一个像素得z缓冲大于已有的将不会去渲染。可以通过ZWrite Off关闭深度缓冲

4、当开启多个光源时, 动态批处理将失效

5、光源的方向:_WorldSpaceLightPos0在定向光时候只包含了光的方向。而对于点光源,我们需要自己计算light.dir = normalize(_WorldSpaceLightPos0.xyz - i.worldPos);得到从物体到光源的方向向量

6、灯光衰减:定向光源是没有光源的衰减的,而点光源等光源是随距离有衰减的。原理:这个是点光源他总共有1的光源,可以想象在一个球上,随着半径增大,球的面积越来越大,而光的强度是固定的,所以分布在球面上的光粒子密度逐渐变小,首先球表面积为4πr^2,4π为常数忽略;

float3 lightVector = _WorldSpaceLightPos0.xyz - i.worldPos;
    float attenuation = 1 / (1 + dot(lightVector, lightVector));
    light.color = _LightColor0.rgb * attenuation;

由于当光源与物体距离接近0时,无限大。所以加上了1。下图为没有加1的情况

截屏2021-02-10 下午8.15.34.png

7、灯光范围:由于我们自定义的衰减。但是灯光还有一个范围之说。超过此范围不应该再渲染了。所有我们需要的效果是:当物体在灯光范围边缘位置,衰减应该趋近于0。

//unity已经有相关的文件了,所以我们不必自己编写
#include "AutoLight.cginc"
//第二个参数是阴影相关
UNITY_LIGHT_ATTENUATION(attenuation, 0, i.worldPos);

//此时有了范围但是衰减并没有效果。因为默认为定向光源
//所以在相应的PASS下定义:如点光源:
#define POINT

8、着色器变体: 7中编写了点光源类型的附加光源,但是如果突然切换到平行光。那么就没有了意义。
所以可以设置着色器的变体,根据不同光源得到不同的光源效果

//SPOT是聚光灯
#pragma multi_complie DIRECTIONAL POINT SPOT
//并将原来灯光的方向改变
#if defined(POINT) || defined(SPOT)
    light.dir = normalize(_WorldSpaceLightPos0.xyz - i.worldPos);
#else
    light.dir = _WorldSpaceLightPos0.xyz;
#endif

9、聚光灯和点光源可以设置cookie:cookie是就是alpha通道用于遮挡光线,其他通道咩有什么用途
在设置点光源cookie时,也需要设置变体,现在已经有很多变体了所以unity将这个内置了#pragma multi_complie_fwadd

10、顶点光:逐顶点光照比逐片元渲染廉价,只有点光源才可以逐顶点, 通过如下开启#pragma multi_complie _ VERTEXLIGHT_ON

11、顶点光和球谐函数:涉及数学太多,后面细学

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值