LearnOpenGL 2.2 光照.基础光照

冯氏光照模型Phong Lighting Model

主要结构为三个部分:

  1. 环境光照
  2. 漫反射Diffuse
  3. 镜面Specular

顶点着色器:计算并输出世界坐标系中光源的位置和片段的位置。(法向量也需要转换到世界坐标系中,但是转换并不是简单地把它乘以一个模型矩阵就能搞定的,法向量的模型矩阵是专门的发现矩阵)
片段着色器:进行光照计算,坐标系是世界坐标系。法向量和光源的入射方向向量要标准化。

环境光照
使用一个环境光照常量,它永远会给物体一些颜色。这是一种简化的全局照明模型,使用一个很小的常量(光照)颜色,添加到物体片段的最终颜色中,这样子的话即便场景中没有直接的光源也能看起来存在有一些发散的光。

漫反射Diffuse
模拟光源对物体的方向性影响(Directional Impact)。它是冯氏光照模型中视觉上最显著的分量。物体的某一部分越是正对着光源,它就会越亮。计算漫反射的影响因子。注意点乘结果不能为负数。

两个单位向量的夹角越小,它们点乘的结果越倾向于1。当两个向量的夹角为90度的时候,点乘会变为0。因此夹角越大,光对片段颜色的影响就应该越小;反之影响越大。要计算漫反射光照要知道片段的法向量和光源的入射方向。

顶点的法向量:一个顶点是空间中的一个独立点,本身并没有表面,顶点的表面由其周围顶点围成一个表面算出。模拟太阳系时都是使用球体,球体的法向量根据顶点计算即可。在顶点数据中添加额外的法向量数据,修改顶点属性来适应新的顶点数组的大小。
法向量转换到世界坐标系中时,如果对物体本身执行任何缩放操作,让模型矩阵乘以法向量即可。
但是如果物体进行了不等比缩放,法向量就必须使用法线矩阵去转换。
法线矩阵中包含逆矩阵运算和转置矩阵计算,对于着色器来说,逆矩阵是一个开销比较大的运算,因此,只要可能就应该避免在着色器中进行逆矩阵运算,它们必须为你场景中的每个顶点都进行这样的处理。用作学习目这样做是可以的,但是对于一个对效率有要求的应用来说,在绘制之前你最好用CPU计算出法线矩阵,然后通过uniform把值传递给着色器(像模型矩阵一样)。

只有被照射物体需要法向量,光源不需要,就模拟太阳系模型来说,太阳作为光源,可以和地球月亮使用相同的顶点数据,虽然这样做太阳的顶点数据中也包含了法向量看起来不是那么高效,但这些顶点数据已经储存在GPU的内存里了,并不需要储存新数据到GPU内存中,这实际上比给太阳专门分配一个新的VBO更高效,注意顶点属性的步长参数。

镜面光照
模拟有光泽物体上面出现的亮点。镜面光照的颜色相比于物体的颜色会更倾向于光的颜色。
镜面光照不仅依赖于光的入射方向和物体的法向量,还依赖于观察方向。
通过反射法向量周围光的方向来计算反射向量。然后我们计算反射向量和视线方向的角度差,如果夹角越小,那么镜面光的影响就会越大。它的作用效果就是,当我们去看光被物体所反射的那个方向的时候,我们会看到一个高光。

其他光照模型:
平滑着色 :产生马赫带效应
高洛德着色 :在顶点着色器中实现的冯氏光照模型叫做Gouraud着色(Gouraud Shading)。由于未进行插值,这种光照看起来有点逊色,冯氏着色能产生更平滑的光照效果。

学习网址:https://learnopengl-cn.github.io/02%20Lighting/02%20Basic%20Lighting/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值