三维场景光照渲染的几种选择
在屏幕上呈现的三维物体的明暗和颜色,会受场景的光照的影响,如何计算这些光照造成的明暗颜色呢?一般来说有三种方法:
一、基于光栅化的经验模型
基于经验,我们发现一个物体上的光照,似乎可以分成3种:漫反射、高光、环境光,我们把这3种光线分别计算出来,再叠加在一起。如经典的布林-冯着色模型:
漫反射计算:任何物体表面都有,等于光线强度*光照角度*漫反射系数。
高光计算:光滑表面才有,等于光照强度*观测角度*高光系数。
环境光:用一个常数表示,作用是不至于没光线直线的地方完全黑。
布林-冯着色模型的优点:
1.相对于光线追踪,计算量小,实时渲染效率更高。根本原因是它是基于光栅化的渲染模型,可以选择逐像素渲染,也可以选择逐顶点渲染或者面渲染(其他像素用差值得到),可以通过牺牲质量加快速度。
布林-冯着色模型的缺点:
1.漫反射、高光、环境光毕竟是根据经验而得来的,无法模拟真实的光照效果。具体如漫反射和高光系数如何定、光照强度如何定、环境光仅仅用常数表示是否不妥、真实世界是否真的由这三种光叠加而来,都无法解决,只能靠经验大概给出一个值。最终造成渲染出来的效果为“塑料感”;
2.无法计算阴影,只能用对比着色点和观测点的距离、着色点和光照的距离,两者的深度对比得到;
3.无法表示反射光,如一个物体的材质如何是镜面或金属,真实情况应该是能反射看到周围的物体的,但在布林-冯着色模型却无法看到。
二、光线追踪
光线追踪是通过从观测点向像素发射一条光线,碰撞到最近的物体,再不断反射和折射弹向其他物体,最终收集所有弹到的物体表面的光强度来得到像素的光照值。
光线追踪的优点:光线追踪由于是基于物理反射,自然有了光线弹射,解决了布林-冯着色模型不能反射光的缺点,同时也顺便解决了阴影问题(光的强弱自动表示成阴影,不用额外计算阴影)。
光线追踪的缺点:
1.计算量大,难以像经验模型那样用逐定点或逐面插值计算;
2.光线反射和折射不完全准确,因为只有一个方向,现实情况是会向四面八方弹射。
光线追踪虽然没有了“塑料感”,能比较好的模拟现实光照,但仔细看还是会觉得不真实,表现为有的地方过曝,而有的地方又过暗。
三、路径追踪(高级光线追踪)
路径追踪的原理见光线追踪-路径追踪原理 - 银龙背上的骑士 - 博客园 (cnblogs.com)
路径追踪是如何解决光线追踪的第2个问题的呢?关键在于BRDF(双向反射比分布函数),即明确定义在物体表面反射到各个方向的光线强度。于是反射不仅仅是一个方向上的环境光,而是整个半球面上的环境光的积分。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律