`
absolute
  • 浏览: 188114 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

各种光照计算的原理

    博客分类:
  • CG
阅读更多

这个教程用到了向量数学知识,如果你对向量数学还不是很了解,请先阅读向量教程:read the tutorial

光照与物体表面的相互作用可以通过将一些数学公式应用于基于per pixel(区别于基于顶点)的着色,从而模拟出真实生活中的各种材质效果。比如浮雕效果,波浪效果,油漆效果等。

在这个教程中,我们有如下假定:

第一,我们讨论的是基于像素着色(per-pixel basis),每个pixel有它自己的位置向量,法线向量以及表面颜色(Surface color,在这里可以是来自纹理的颜色,也可以是RGB颜色(flat color));

第二,表面颜色Surface color)通常是由R,G,B三部分组成,在这个教程中,我们把它当作一个向量看待;

第三,输入表面颜色(光照处理前的表面颜色,这里的“输入”可以理解为函数的输入参数的“输入”)只是普通的颜色(单纯的纹理颜色或者RGB颜色),而输出表面颜色(光照处理后的表面颜色)是光照作用于表面的合成颜色,如可以是有阴影,高光等效果的颜色。

第四,这个教程中假设每个场景中只有一个灯光。对于多灯光的场合,对每一个灯光循环进行这些运算(环境光除外)。

 

好了,让我们开始讲解各种光照的算法原理

 

Ambient Lighting 环境光

 

在真实生活里,有光线的房子里的物体不会是全黑的,总有一些光量子照亮物体表面,即使这个表面是背对光源的,这就是环境光的原因。我们不考虑环境光的照射方向,我们总认为场景中的物体,不论它在什么位置,总会受到一定数量的环境光照射(全局照明)。环境光照算法如下:

 

Inputs:

       Col – 物体原表面颜色

        AmbAmount – 场景中环境光的强弱程度 (介于0 1之间)

     Outputs:

        SurfaceColor – 环境光照作用之后的表面颜色

        SurfaceColor = Col*AmbAmount;

 

环境光照效果图:

 

Lambert Shading (郎伯特着色,郎伯特:物理上的亮度单位,在这里就是漫射光作用)

 

现在我们真正开始考虑一束光照射在物体表面上的作用过程,我们使用最常见的光照算法-------漫反射光照着色或者说郎伯特余弦定律或郎伯特着色(三个都一回事),这个算法是将入射光与表面法线向量的点积当作漫反射光照强度因子,下面我们看看环境光照与漫射光照共同作用的算法:

 

Inputs:

        LCol – 照射在表面上的漫射光

        Pos – 表面上被照射的位置

        LPos – 漫射光源的位置

        N -表面上被照射的位置处的法向量

        Col –物体原表面颜色

        AmbAmount -场景中环境光的强弱程度 (0 to 1)

Outputs:

        SurfaceColor -环境光照与漫射光照共同作用之后的表面颜色

 

        VectorToLight = Normalise(LPos - Pos);

        DiffuseFactor = Dot(VectorToLight, Normal); //DiffuseFactor ranges from 0 to 1

//光线与表面法线夹角大于90度,想像下光线在表面背面射过来,正表面肯定没有光照

   if(DiffuseFactor < 0)

        then DiffuseFactor = 0;

 

        //环境光照与漫射光照共同作用

    SurfaceColor = Col*AmbAmount + Col*DiffuseFactor*LCol;

 

环境光与漫射光共同作用效果

 

Specular Highlights镜面高光

现在我们考虑物体表面有光泽的效果,这种效果是将Phong反射模型,结合前面两个光照作用而成。这中光照效果计算需要知道观察者在场景中的位置,而先前的环境光照与漫射光照效果计算都与观察者所在位置无关的。

这种光照计算是这样的,首先我们计算入射光在表面处的反射光线,然后再将反射光线与视线(观察者的眼睛与表面观察点的连线)之间的点积值当作反射到观察者眼中的光照强度因子,因为表面上高亮的部分是反射光线反射到观察者眼睛或照相机中较多的地方,这些地方的反射光线与视线之间的夹角非常小,点积值就越大。

 

Inputs:

        ViewPos – 观察者的位置

        SpecAmount – 镜面光强弱. (from 0 to about 200)

        SpecCol – 镜面光颜色(通常为白色).

 

        LCol – 照射在表面上的漫射光

        Pos – 表面上被照射的位置

        LPos – 漫射光源的位置

        N -表面上被照射的位置处的法向量

        Col –物体原表面颜色

        AmbAmount -场景中环境光的强弱程度 (0 to 1)

 

Outputs:

        SurfaceColor -环境光照,漫射光照与镜面光共同作用之后的表面颜色

        

        DiffuseFactor = ... //经前两个光照作用得来的颜色

       

        DirectionToViewer = Normalise(ViewPos - Pos);

        VectorToLight = Normalise(LPos - Pos);

        //计算反射光

        ReflectanceRay = 2 * Dot(N, VectorToLight) * N - VectorToLight;

   

    //计算镜面光照因子. 数学公式 SpecFac = (R dot N)^Spec

    SpecularFactor = Pow(Dot(ReflectanceRay, DirectionToViewer), SpecAmount);

   

        //环境光照,漫射光照与镜面光共同作用

    SurfaceColor = Col*AmbFactor + Col*DiffuseFactor*LCol + SpecCol*SpecularFactor;

环境光照,漫射光照与镜面光共同作用

 

Note:可以在一个场景中使用多个漫射光照与镜面光作用

Fresnel Term 菲涅尔准则

菲涅尔效果是根据观察者的观察表面来调整反射率来实现的。比如你从水面,油漆表面或者丝绸的正上方看,反射光泽的柔和效果基本没有,如果侧着或平着看的话,反射光泽的柔和效果就很明显,这就是菲涅尔效果。我们简单地通过点积操作计算表明法线与视线之间夹角的余弦值,再将这个值加权。对于较平滑表面,加权系数设置在1.0-5.0之间(油漆效果,丝绸等),对于比较凹凸的表面,加权系数设置为8.0或更高(水波,液体等)

 

Inputs:

        ViewPos – 观察者的位置

        FresAmount – 边缘或表面的尖锐程度. (油漆丝绸:1,液体: 2-8)

        FresCol - frenel 反射光 (通常使用reflection map or 类似的东西).

 

        LCol – 照射在表面上的漫射光

        Pos – 表面上被照射的位置

        LPos – 漫射光源的位置

        N -表面上被照射的位置处的法向量

        Col –物体原表面颜色

        AmbAmount -场景中环境光的强弱程度 (0 to 1)

 

Outputs:

        SurfaceColor -环境光照,漫射光照与镜面光,菲涅尔反射共同作用之后的表面颜色

        

        DiffuseFactor = ... //环境光照,漫射光照作用得来的颜色

        SpecularFactor = ... //镜面高光作用得来的颜色

 

        DirectionToViewer = Normalise(ViewPos - Pos);

        //计算fresnel因子. 我们计算视线与表面法向量间夹角的余弦值([-1..1]之间),然后加一,移动到区间[0..2],然后再加权。

        FresnelTerm = Pow(Dot(N, DirectionToViewer)+1, FresAmount);

   

        //确保因子的在正常范围内

        if (FresnelTerm > 1)

               then FresnelTerm = 1; 

    //无菲涅尔反射的场合: Ambient light, Diffuse Light and Specular Light

         NonReflective = Col*AmbFactor + Col*DiffuseFactor*LCol + SpecCol*SpecularFactor;

 

        Reflective = FresCol;

        //环境光照,漫射光照与镜面光,菲涅尔反射共同作用

    SurfaceColor = NonReflective*(1-FresnelTerm) + Reflective*FresnelTerm;

               

漫射无菲涅尔反射时效果                    漫射有菲涅尔反射时效果

分享到:
评论

相关推荐

    STM8+OPT3001,附带完整工程,原理图和自学笔记.zip

    OPT3001采集的光照强度数值可以用查询的方式读取和计算,也可以设定上限和下限值,超出范围后会触发中断,通过中断的方式可以有效降低功耗。这两种方式我都调通了,stm8睡眠和唤醒以及一些别的外设没有加上去,感...

    计算机图形学原理及实践C语言描述

    包括srgp的编程、画二维图元的基本光栅图形学算法、图形硬件、几何变换、三维空间的观察、对象的层次结构和sphigs...光照计算、图像处理与存储、高级光栅图形体系结构、高级几何与光栅算法、高级建模技术和动画等内容...

    计算机毕业设计:基于springboot+深度学习的人脸识别会议签到系统(源码+文档),保证可靠运行,附赠计算机答辩PPT模板

    在人脸识别算法的选择上,该项目采用了先进的深度学习模型,通过大量的训练数据优化模型参数,使得系统能够应对各种复杂场景和人脸变化。无论是光照、角度还是表情的变化,系统都能准确识别出参会人员,确保签到的...

    OpenGL ES 3.x游戏开发 上卷 吴亚峰.pdf

    OpenGL ES 3.x 可编程渲染管线着色器的着色语言介绍,3D 开发中投影、各种变换的原理与实现,介绍了OpenGL ES 3.x中光照的基本原理与实现、点法向量与面法向量的区别以及光照的每顶点计算与每片元计算的差别,...

    Ray Casting 光线跟踪算法程序 实现了SSD MIP DRR三种方式

    基本原理:三维物体表面的检测隐含在光线跟踪处理中,在给定的表面条件满足时,光线停止,同时在光线与物体相交处计算表面法线方向矢量,然后利用光照模型计算亮度值,赋给相应的绘制值,形成光照效果的三维表面显示...

    GE 安卓照度计-视力保护助手

    照度计的应用场合很广泛,厂房,学校,图书馆,商务楼,酒店,商业展厅,实验室,计算机房等等,这些地方都要用到照度计,可以夸张的说一下,只要有亮光的地方,就可能用到照度计来测量当前的照度。 本软件是一款...

    包装生产线的流水线计数器设计

    第二种称之为内光电效应,也就是说物体的电阻率随着光照的变化而发生变化,根据内光电效应制成的主要元器件包括各种各样的光敏电阻;第三种光电效应指的是光生伏特效应,也就是说物体在一定的外界光线的照射作用下所...

    论文研究-基于有限状态自动机的人眼开度PERCLOS实现算法.pdf

    针对驾驶员驾驶过程中因疲劳引起的眼睛开度变化问题,在原有PERCLOS(percentage of eyelid closure over the pupil over ...实验结果表明本方法能够实时监测驾驶员疲劳状况,具有对光照变化、脸部配饰不敏感的特点。

    计算机图形学(Computer Graphics)

     简单地说,计算机图形学的主要研究内容就是研究如何在计算机中表示图形、以及利用计算机进行图形的计算、处理和显示的相关原理与算法。图形通常由点、线、面、体等几何元素和灰度、色彩、线型、线宽等非几何属性...

    Android 3D游戏开发技术宝典-OpenGL ES 2.0 (吴亚峰) 源代码

    6.5 光照的每顶点计算与每片元计算 202 6.6 本章小结 204 第7章 纹理映射 205 7.1 初识纹理映射 205 7.1.1 基本原理 205 7.1.2 纹理映射的简单案例 206 7.2 纹理拉伸 212 7.2.1 两种拉伸方式...

    光伏离网发电系统设计-模板(含计算)

    指光照使不均匀半导体或 半导体与金属结合的不同部位之间产生电位差的现象。它首先是由光 子(光波)转化为电子、光能量转化为电能量的过程;其次,是形成 电压过程。有了电压,就像筑高了大坝,如果两者之间连通,...

    基于Canny算子加权引导滤波的Retinex医学图像增强算法

    然后根据Retinex算法原理计算出反射光分量,即log域上的增强图像;最后对图像进行量化处理,增强其图像对比度从而得到输出图像。对比实验结果表明,论文算法在提高图像对比度的同时,具有更高的边缘保持特性,能够...

    基于Android的人脸门禁系统 计算机毕设 完整代码 可直接运行

    首先分析了局部二值模式LBP和主成份分析PCA的原理,研究了LBP与PCA相结合的特征提取方法。相对于单独使用PCA方法,该组合方法能够有效地降低光照变化对人脸识别准确度的影响。然后,采用支持向量机对特征

    OpenGL 基础教程

     9.1.1 颜色生成原理  9.1.2 RGB色立体  9.2 颜色模式  9.2.1 RGBA模式  9.2.2 颜色表模式  9.2.3 两种模式应用场合  9.3 颜色应用举例  第十章 OpenGL光照  10.1 真实感图形基本概念  10.2 光照模型  ...

    OpenGL基础图形编程

     9.1.1 颜色生成原理  9.1.2 RGB色立体  9.2 颜色模式  9.2.1 RGBA模式  9.2.2 颜色表模式  9.2.3 两种模式应用场合  9.3 颜色应用举例  第十章 OpenGL光照  10.1 真实感图形基本概念  10.2 光照模型  ...

    OpenGL图形开发指南(0fen)

    第九章 OpenGL颜色 9.1 计算机颜色 9.1.1 颜色生成原理 9.1.2 RGB色立体 9.2 颜色模式 9.2.1 RGBA模式 9.2.2 颜色表模式 9.2.3 两种模式应用场合 9.3 颜色应用举例 第十章 OpenGL光照 10.1 真实感图形基本...

    论文研究-基于颜色不变量和SURF的彩色图像拼接.pdf

    该方法利用图像彩色信息计算得到的颜色不变量信息代替灰度信息作为输入,提取图像SURF特征点并进行特征点匹配,根据相似性变换原理对误匹配点进行过滤,提高变换矩阵计算的准确率,采用亮度渐变原则对重叠区域进行...

    精通DirectX.3D图形与动画程序设计.pdf

    5.5 深入理解光照计算模型 5.6 小结 第6章 纹理映射基础 6.1 基本概念 6.2 使用纹理 6.3 纹理过滤方式 6.3.1 最近点采样  6.3.2 线性纹理过滤 6.3.3 各项异性纹理过滤 6.3.4 多级渐进纹理过滤 6.3.5 纹理过滤方式...

Global site tag (gtag.js) - Google Analytics