首页 - 实时渲染 - 实时渲染和预渲染的区别:3种渲染方法介绍

实时渲染和预渲染的区别:3种渲染方法介绍

admin admin 2019年06月10日 实时渲染 我有话说(0人讨论) 639次浏览

1.jpg

实时渲染就是每一帧都不假设任何条件,都是针对当时实际的光源,相机和材质参数进行光照计算——常见的D3D,OPENGL的光照计算。预先渲染一般是固定光源,和物体的材质参数,通过其他的辅助工具,把光源对物体的光照参数输出成纹理贴图,在显示的时候不对物体进行光照处理,只进行贴图计算

预先渲染可以借助复杂的高效果的工具,对场景进行精细的长期的渲染,然后在浏览的时候直接利用这些以前渲染的数据来绘制,从而可以在保证渲染的速度的时候获得很好的渲染质量。但是缺点是,不能很好的处理动态的光源和变化的材质,在交互性比较强的环境当中无法使用。

实时渲染,一般有三种渲染方法,多光源一次渲染,多光源多次渲染和延迟着色。

多光源一次渲染:对于每个物体,计算所有光源对其的影响来对该物体进行渲染

for each object do

    for each light do

        framebuffer = light_model(object,light);

这是一个简单的方法,但是存在一些问题和缺陷。 

第一个问题由于光照是针对每一个物体进行的,因此*之前渲染着色的对象能够被之后渲染着色的对象所取代*,换句话讲,对隐藏对象进行着色是浪费的。 

第二个问题是如何在可编程渲染管线中,在一次渲染过程中管理多个光源。此外,该方法很难与阴影算法进行集成。

多光源多次渲染:对于每一个光照计算过程,执行所有光照计算。因此,对于每一个光源,所有被该光源影响的物体会被渲染

for each light do

    for each object affected by light do

        framebuffer += light_model(object,light);

与第一个方法类似, 

第一个问题:隐藏曲面会造成渲染的浪费。 

第二个问题:光照首先对于每一个光源计算,然后对每一个物体计算。有可能有一些计算过程(例如,顶点转换和三角面片设置[Moller02])由于同一个物体在另外一个光照计算中被再次处理而重复计算。 

第三个问题:由于光源排序和物体排序时互斥的,因此很难执行此操作。

延迟着色:原理,将每个像素点的属性存储在显存里面用于后面的渲染,后面的渲染则是一个像素一个像素的渲染,每个像素都会独立的渲染。 

在上面两种渲染方法,延迟着色有很大的优势,特别是在效率上面,时间复杂度要小很多

for each object do

    G-buffer = lighting properties of object;

for each light do

    framebuffer += light_model(G-buffer,light);

延迟着色还有一些其它优势。例如,一旦几何处理和光源处理进行解耦分离,很容易进行批操作。

发表评论:

昵称(必填)

邮箱(选填)

网址(选填)

正文(必填)

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。