聊聊引擎底层如何实现Forward+Phone渲染

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jxw167/article/details/85063864

现在的渲染技术由于硬件的提升,算法也得到了极大的改进,Forward,Deferred在成熟引擎中已经得到了广泛的应用,比如Unity,UE4等。下面我们将其应用到我们自己的引擎中,先看看Phone算法。

  • Phone算法
    首先要了解Phone模型算法的作用,它是计算镜面反射光强的模型,它的计算公式是一个叫Phong Bui Tuong提出的,我们的Shader编程也是根据此算法实现的,看下面的公式:
    在这里插入图片描述
    Ks为材质的镜面反射系数,Ns是高光指数,V表示从顶点到视点的观察方向,R 代表反射光方向。
    反射光的方向R,可以通过入射光方向L,(从顶点指向光源)和物体法向量N求出:
    在这里插入图片描述
    进而推导出:

在这里插入图片描述这样我们的R就求出来了,V的值可以确定,其他的值,我们可以通过引擎传值进来会最终实现我们的Phone模型方程。我们的Phone模型转化成编程语言模型还可以这样表达:
在这里插入图片描述
再看看Phone的改进算法,Blinn-Phong模型

  • Blinn-Phone模型
    相比较Phong模型,Blinn-phong模型只适用N•H替换了V•R,在运行效率以及渲染效果得到了质的提升,它的算法公式如下所示:
    在这里插入图片描述
    N是顶点的单位法向量,而H则是入射光L和顶点到视点的单位向量的角平分线单位向量,通常也成为半角向量。其计算方法为:
    H = (L + V) / (|L + V|)
    对应的Shader脚本如下所示:
    在这里插入图片描述
    这样我们就完成了Phone Shader工作,下面我们将其加入到Forward 中,换句话说就是Forward+phone渲染种,另外,给读者介绍一个在DX11中出现了的Forward+框架,该框架主要是用于渲染场景中上千种灯光,当然我们的Forwar + phone渲染并没这么处理,我们只处理了10多盏灯光而已,跟Forward+是无法箱体相提并论的。下面给读者展示Forward+框架对于上千盏灯光渲染的场景:
    在这里插入图片描述
    而我们实现的Forward+phone脚本,实质上就是对场景中的多盏灯光做了一个遍历:
    在这里插入图片描述
    代码红色部分就是我们的Forward+phone的核心所在,引擎中的代码主要是对Shader进行传值操作,如下所示:
    在这里插入图片描述
    这样我们就把Forward + Phone成功的引入到了我们的引擎中,利用它实现的渲染效果如下所示:
    在这里插入图片描述
    总结:
    在这里并没有过多的讲解Forward+框架,三言两语讲不清楚的,这个可以单独写篇博客介绍了,本篇博客主要还是介绍了Phone的算法实现以及将它应用到引擎中,主要目的是告诉读者,我们如何将枯燥的公式换算成编程语言加以实现。

猜你喜欢

转载自blog.csdn.net/jxw167/article/details/85063864