1. 什么是渲染路径(Rendering Path)?
在Unity中,渲染路径决定了光照是如何应用到Unity Shader中的。因此,如果要和光源打交道,就要为每个Pass指定它的渲染路径。
相当于跟Unity约定某种规则,我要使用这种渲染路径,那么Unity会根于约定的规则,把相应的数据放到对应的位置。
只有为Shader正确的设置了渲染路径,该Shader的光照计算才能被正确执行。
大多数情况下,一个项目只使用一种渲染路径。
2. Unity有哪些渲染路径?
Unity5.0之后,
前向渲染路径(Forward Rendering Path):是传统的渲染方式,也是最常用的一种。
延迟渲染路径(Deferred Rendering Path)
3. 前向渲染路径原理是什么?
Pass{
for( each primitvie in this model){
for( each fragment coverd by this primitive){
if( failed in depth test){
/// 如果没有通过深度测试,说明该片元不可见
discard;
}else{
/// 如果该片元可见,进行光照计算
float4 colro = Shading(materialInfo, pos, normal, lightDir, viewDir)
/// 更新帧缓冲
writeFrameBuffer( fragment, color );
}
}
}
}
4. 前向渲染有几种?
有两种。
Base Pass:会计算环境光,最重要的平行光,逐顶点/SH光源和Lightmaps。
Additional Pass:会计算额外的逐像素光源,每个Pass对应一个光源。
5. 前向渲染路径有什么问题?
当场景中包含大量实时光源时,前向路径的性能就会急剧下降。
假设场景中有N个物体,每个物体受到M个光源的影响,那么要渲染整个场景,就需要N*M个Pass。因此,如果逐像素光照比较多,那么Pass就会很大。而每执行一个Pass,就需要重新渲染一遍物体,但很多计算是重复的。
6. 为什么要使用延迟渲染路径?
除了前向渲染路径中的颜色缓冲和深度缓冲外,延迟渲染还会利用额外的G缓冲(G-buffer)。G-buffer存储了我们关心的表面的其他信息,例如该表面的发现,位置,用于光照计算的材质属性等。
6. 延迟渲染路径的原理是什么?
Pass1{
/// 第一个Pass不进行真正的光照计算,仅仅把光照计算需要的信息存储到G-buffer中
for(each primitive in this model){
for(each fragment covered by this primitive){
if( failed in depth test ){
/// 如果没有通过深度测试,说明该片元是不可见的
discard;
}else{
/// 如果该片元可见,那就把重要的信息存储到G-buffer中
writeGBuffer( materialInfo, pos, normal );
}
}
}
}
Pass2{
/// 利用G-buffer中的信息进行真正的光照计算
for( each pixel in this screen ){
if( the pixel is valid ){
/// 如果该像素是有效的,读取它对应的G-Buffer中的信息
readGBuffer( pixel, materialInfo, pos, normal );
/// 根据读取到的信息进行光照计算
float4 color = Shading( materialInfo, pos, normal, lightDir, viewDir);
/// 更新帧缓冲区。
writeFrameBuffer( pixel, color );
}
}
}
7. 延迟渲染的再理解
从上面可见,延迟渲染使用的Pass就是两个,跟场景中光源数目无关。也就是说,延迟渲染的效率不依赖于场景的复杂度,而是跟屏幕空间的大小相关。所以,它适用于场景中光源数目多,使用前向渲染会造成性嗯呢该瓶颈的情况下使用,而且,延迟渲染路径中每个光源都可以按照逐像素的方式处理。
延迟渲染的意思就是,把光照计算延迟到第2个Pass来进行计算。
8. 延迟渲染那么牛逼,那都用延迟渲染不就行了吗,为什么还要有前向渲染?
延迟渲染有自己的缺点:不支持真正的抗锯齿功能;不能处理半透明物体;对显卡有一定要求;
9. 其他
当然还有其他渲染路径,顶点渲染路径(5.0后已被抛弃,其实是前向渲染路径的子集),遗留的延迟渲染路径等。自己根据需要去查看。
另外,因为不同的渲染路径跟Unity约定了不同的数据存放方式,所以,具体用到哪个渲染路径的时候,再去查看就可以了。我记不住。。。
10. 怎么选择渲染路径
根据自己游戏的需求来进行选择。
另外,如果当前显卡不支持所选的渲染路径,那么Unity会自动使用比其低一级的渲染路径。