shader学习之路——前向渲染

目的:为了处理多个光源渲染,效能与场景里灯光的数量有关系,比较适合手机平台。延迟渲染比较适合主机平台,与渲染的分辨率有关

前向渲染(ForwardBase):把每一个物体用每盏灯渲染一遍,再将渲染的结果混合起来 

开销:灯光数量*场景中要被灯光渲染的物体数量       平行光<点光源<聚光灯

Unity光照模式:1.逐像素   2.逐顶点   3.球谐函数

角色和光源可能是动态的,如何保持平衡帧率

unity在底层有优化,Pixel Light Count是最大逐像素灯光的数量,对小球的光照效果最明显的灯光,其余灯光是使用逐顶点或者球谐函数

灯光亮度(Intensity)unity底层有个排序

Render Mode:Not Important  会按逐顶点或者球谐函数来处理

                         Important        会按逐像素处理

灯光D既受像素光影响又受顶点光影响

Tags{"LightMode" = "ForwardBase"}  //基础pass  一盏平行光(逐像素光照)、所有顶点光、所有球谐

Tags{"LightMode" = "ForwardAdd"} //额外的逐像素光照

分Base和Add的目的是:base通道里渲染主灯光和性能开销比较小的逐顶点光和球谐光,其余消耗比较高又不重要的放在add里面渲染

而对于逐顶点/SH光源来说,它们都将会在Bass Pass中处理(和最重要的平行光一起)。没分量就是这种结果。那么,Base Pass会说,“我这么小就让我做这么多东西,平行光就一个数量少就算了,SH光工作量少也算了,但顶点光也来捣乱我就不干了,不行!我得有条件!”于是Unity规定说,最多只有4个光源会按照逐顶点光源来处理,其他只能按SH光源处理
 

Blend One One :一个源颜色 * 1 + 目标颜色 * 1   目标颜色:已写入帧缓存的颜色    源颜色:即将写入帧缓存的颜色   如果不设置的话 ForwardAdd会把ForwardBase覆盖掉

URP里面合并为一个pass里实现渲染,放在一个pass里可以防止一些效果或者网格渲染因为两个pass造成渲染流水线被打断

#pragma multi_compile_fwdbase   //使用在base通道里   //shader变体   会在内部生成很多shader宏定义(标识) shader变体是由unity引擎根据当前渲染方式传入的

 #pragma multi_compile_fwdadd    //使用在Add通道里

渲染路径的设定:

for (每个逐像素光源)
{
    Pass
    {
        for(模型中的每一个三角形)
        {
            for(三角形中的每一个片元)
            {
                if(深度测试失败) //说明该片元是不可见的,丢弃
                {discard;}
                else
                {//如果该片元可见就进行光照计算
                    float4 color = Shading(materialInfo,...,normal,lightDir,viewDir);
                    //更新帧缓冲
                    writeFrameBuffer(fragment,color);
                }
            }
        }
    }
}

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值