三维场景光照渲染的几种选择

在屏幕上呈现的三维物体的明暗和颜色,会受场景的光照的影响,如何计算这些光照造成的明暗颜色呢?一般来说有三种方法:

一、基于光栅化的经验模型

基于经验,我们发现一个物体上的光照,似乎可以分成3种:漫反射高光环境光,我们把这3种光线分别计算出来,再叠加在一起。如经典的布林-冯着色模型

 

 

漫反射计算:任何物体表面都有,等于光线强度*光照角度*漫反射系数。

高光计算:光滑表面才有,等于光照强度*观测角度*高光系数。

环境光:用一个常数表示,作用是不至于没光线直线的地方完全黑。

布林-冯着色模型的优点:

1.相对于光线追踪,计算量小,实时渲染效率更高。根本原因是它是基于光栅化的渲染模型,可以选择逐像素渲染,也可以选择逐顶点渲染或者面渲染(其他像素用差值得到),可以通过牺牲质量加快速度。

布林-冯着色模型的缺点:

1.漫反射高光环境光毕竟是根据经验而得来的,无法模拟真实的光照效果。具体如漫反射和高光系数如何定、光照强度如何定、环境光仅仅用常数表示是否不妥、真实世界是否真的由这三种光叠加而来,都无法解决,只能靠经验大概给出一个值。最终造成渲染出来的效果为“塑料感”;

2.无法计算阴影,只能用对比着色点和观测点的距离、着色点和光照的距离,两者的深度对比得到;

3.无法表示反射光,如一个物体的材质如何是镜面或金属,真实情况应该是能反射看到周围的物体的,但在布林-冯着色模型却无法看到。

二、光线追踪

光线追踪是通过从观测点向像素发射一条光线,碰撞到最近的物体,再不断反射和折射弹向其他物体,最终收集所有弹到的物体表面的光强度来得到像素的光照值。

 

 

光线追踪的优点:光线追踪由于是基于物理反射,自然有了光线弹射,解决了布林-冯着色模型不能反射光的缺点,同时也顺便解决了阴影问题(光的强弱自动表示成阴影,不用额外计算阴影)。

光线追踪的缺点:

1.计算量大,难以像经验模型那样用逐定点或逐面插值计算;

2.光线反射和折射不完全准确,因为只有一个方向,现实情况是会向四面八方弹射。

光线追踪虽然没有了“塑料感”,能比较好的模拟现实光照,但仔细看还是会觉得不真实,表现为有的地方过曝,而有的地方又过暗。

三、路径追踪(高级光线追踪)

路径追踪的原理见光线追踪-路径追踪原理 - 银龙背上的骑士 - 博客园 (cnblogs.com)

 

 

路径追踪是如何解决光线追踪的第2个问题的呢?关键在于BRDF(双向反射比分布函数),即明确定义在物体表面反射到各个方向的光线强度。于是反射不仅仅是一个方向上的环境光,而是整个半球面上的环境光的积分。

posted @   银龙背上的骑士  阅读(427)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示