欢迎光临散文网 会员登陆 & 注册

URP | 多光源阴影-阴影支持SRP Batcher

2022-02-22 12:30 作者:那个人真狗  | 我要投稿

前面俩篇是基础,这个是目录,B站不能增加目录功能

目的

  • Shader支持SRP Batcher

  • Alpha Test 半透明模式支持阴影渲染问题。

效果

半透明

Alpha Test和Alpha Blending是两种处理透明的方法。

扩展 问 :他们有什么区别吗?

Alpha Test

  • Alpha Test是不需要关闭ZWrite的。

  • 渲染队列   可以是2000

Alpha Test产生的效果也很极端,要么完全透明,即看不到,要么完全不透明。

  • 效果

Alpha Blending

  • 需要关闭ZWrite,渲染顺序不能乱。

  • 渲染队列   3000  半透明物体

使用一个我们原来制作的一个Shader做的Alpha Blending效果 测试

下图是关闭 ZWrite 俩个半透明物体叠加的效果

扩展 如果不关闭出现什么问题?

  • 如果不关闭ZWrite,那么在进行深度检测的时候,它背后的物体本来是可以透过它被我们看到的,但由于深度检测时大于它的深度就被剔除了,从而我们就看不到它后面的物体了。因此,我们需要保证物体的渲染顺序是从后往前,并且关闭该半透明对象的ZWrite。

  • 测试结果

前面的半透明渲染会把后面遮挡住。

  • 因此,我们需要保证物体的渲染顺序是从后往前,并且关闭该半透明对象的ZWrite

特效需要有平滑的过度,大部分使用这个模式。

  • 资料参考

    无法增加连接

【Unity Shaders】Alpha Test和Alpha Blending

使用SRP Batcher

在有就是产生的阴影没有合并优化,我们使用多光源就会渲染多次。


在有就是产生的阴影没有合并优化,我们使用多光源就会渲染多次。

我们使用SRP Batcher来合并渲染。

什么是SRP Batcher

  • SRP Batcher 是一个渲染循环,可加速相同着色器变体的多种材质在场景中的CPU渲染速度。

原理

  • Shader中的变体一致

  • 降低Set Pass Call的消耗

SRP Batcher 通过批处理(batching)—— 系列绑定(Bind)和绘制(Draw)GPU 命令,来减少DrawCalls之间的GPU 设置(工作量)

设置管线支持SRP Batcher

  • 首先在Pipeline Asset(渲染管线中)里勾选SRP Batcher。

  • 在下方勾选SRP Batcher

Shader 是否支持SRP Batcher

  • 在Shader界面我们可以看到是否支持这个效果,才会起作用。

    not compatible 是不支持

实现阴影

自定义阴影原理

  • 新建一个Pass 设置光照模式标签 改成  "ShadowCaster”

  • 定义顶点和片元着色器

顶点着色器阶段

  • 我们要得到一个以投射专用的裁剪空间坐标,为了得到这坐标,

    我们需要模型的世界坐标模型的世界法线灯光方向,然后使用函数

    ApplyShadowBias(float3 positionWS, float3 normalWS, float3 lightDirection)

    来得到的特殊的世界坐标,然后转换到裁剪空间得到阴影投射专用的裁剪空间坐标。

  • 然后确保阴影偏移后的位置不会超出裁剪空间。

扩展

  • 其中这个新函数的是定义在Shadows.hlsl 下的,它的定义如下。

  • 函数

计算过程

  • 前把 官方阴影去掉。

  • 开启前我们把公用变量属性放到Pass外, 函数库放到外面是因为我们在第二个Pass也需要使用。

  • 连结构体我们也放到Pass外

顶点着色器阶段

  • 我们前让这个Pass 简单的有阴影。

效果 显示有阴影了,

在Debug里我们看到阴影已经使用SRP Batch了,

但是阴影是有问题的,拉近。

  • 或者使用平面看的明显

我们要得到一个以投射专用的裁剪空间坐标


这个函数需要三个参数,那我们准备好这三个参数。

使用函数计算出裁剪空间的坐标。

然后在计算一下是否需要Z值反向,(比如unity编辑器下是DX11,是有Z反向的 )

来取顶点 z值和 顶点w值 在乘 近裁剪面两者之间取最小值;若未Z反向则取最大值。这样得到的Z值在传递给GPU流水线下一个阶段。


  • 效果

完成

完成

优化结果

  • 现在只需要8次

代码


实现Alpha Test剔除

属性

定义一个变量控制Alpha变化过程。

使用_CUT_ON ,来开启关闭效果

  • 定义变量

定义变量

定义一个开关是否开启AlphaTest 效果

第一个Pass

顶点着色器阶段

  • 这个是控制我们的Alpha通道的,对贴图Alpha通道处理。

Clip 剔除

  • 原来输出的Alpha通道数值是1. 现在改成我们贴图的Alpha值。

  • No模式滑动条可以控制贴图的显示,

但是现在阴影没有产生透过去效果。


阴影支持Alpha模式

这样的模式很多实用在半透明物体上,比如树叶等。

顶点着色器阶段

因为我们是第二个Pass里计算阴影,

那需要把我们贴图的UV信息传入,这里我们是因为上面把结构体定义的变量放到Pass为这一个Pass也可以调用到。

片元着色器阶段

使用开关判断是否输出AlphaTex

至此整体shader就完成了,阴影也支持 透明渲染, 它也兼容了SRP Batcher 。

  • 效果

总结

  • 对Alpha俩种方式的认识和使用。俩种叠加方式的使用,

  • SRP Batcher 的学习使用,把公共属性,放到Pass外,这样第二个Pass使用的时候方便调用不用定义俩次。

    • 函数库


  • 结构体

  • 贴图数据

  • CBUFFER_START

  • 使用第二个Pass制作阴影的时候始终不对,就是因为把宏定义放到第一个Pass里了。

  • 阴影Pass实现过程。


URP | 多光源阴影-阴影支持SRP Batcher的评论 (共 条)

分享到微博请遵守国家法律