美文网首页
Unity中的渲染路径

Unity中的渲染路径

作者: DOGWiT | 来源:发表于2018-10-10 13:50 被阅读0次

    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会自动使用比其低一级的渲染路径。

    相关文章

      网友评论

          本文标题:Unity中的渲染路径

          本文链接:https://www.haomeiwen.com/subject/vuupaftx.html