OpenGL ES 光照

1,111 阅读3分钟

光照基础

从左到右依次为:

  1. 环境光照
  2. 漫反射光照
  3. 镜面光照
  4. 将上述三者合并便是冯氏明暗处理算法 image.png

光照特性

  1. 发射光:由物体自身发光
  2. 环境光:就是在环境中充分散射的光,而且无法分辨它的方向
  3. 漫反射光:光线来自某个方向,但在物体上各个方向反射
  4. 镜面高光:光线来自一个特定的方向,然后在物体表面上以一个特定的方向反射出去

材质属性

  1. 泛射材质
  2. 漫反射材质
  3. 镜面反射材质
  4. 发射材质

光照计算

  1. 环境光的计算(亮度) 环境光 = 光源的环境光颜色 * 物体的材质颜色

image.png 2. 发射光的计算 发射颜色 = 物体的反射材质颜色

光照比较

image.png

漫反射光照计算

image.png 光线照射到物体表面,决定物体表面光照的强度,用下图表示:

image.png

光照强度是光本身强度和光线与物体表面法线夹角cos的乘积,有效的光照方向是与物体表面法线夹角在0~90度之间

漫反射颜色 = 光源的漫反射颜色 * 物体的漫反射材质 * DiffuseFactor

DiffuseFactor = max(0, dot(N, L))

漫反射因子DiffuseFactor是光线与顶点法线向量的点积

image.png

镜面光计算

image.png N: 平面法线

I: 入射光线

H: 反射光线

E: 视线

α: 视点与反射光的夹角

镜面反射颜色 = 光源的镜面光的颜色 * 物体的镜面材质颜色 * SpecularFactor

SpecularFactor = power(max(0, dot(N,H)), shininess)

H: 视线向量E与光线向量L的半向量

dot(N,H): H, N的点积,几何意义为平方线与法线夹角的cos值

shiniess: 高光的反光度

image.png 光照颜色 = (环境颜色 + 漫反射颜色 + 镜面反射颜色)* 衰减因子

衰减因子

image.png 衰减因子 = 1.0/(距离衰减常量 + 线性衰减常量 * 距离 + ⼆次衰减常量 * 距离的平方

距离衰减常量,线性衰减常量和⼆次衰减常量均为常量值。

注意:环境光、漫反射光和镜面光的强度都会受距离的增大而衰减,只有发射光和全局环境光的强度不会受影响。

聚光灯因子

聚光灯夹⻆cos值 = power(max(0,dot(单位光源位置,单位光线向量)),聚光灯指数);

  • 单位光线向量是从光源指向顶点的单位向量
  • 聚光灯指数,表示聚光灯的亮度程度
  • 公式解读:单位光源位置和单位光线向量的点积的聚光灯指数次方

聚光灯无过渡与有过渡处理

image.png

增加过渡计算

聚光灯因⼦ = clamp((外环的聚光灯⻆度cos值 - 当前顶点的聚光灯⻆度cos值)/ (外环的聚光灯⻆角度cos值 - 内环聚光灯的角度的cos值),0,1)

image.png

光照计算终极公式

光照颜色 = 发射颜色 + 全局环境颜色 + (环境颜色 + 漫反射颜色 + 镜⾯面反射颜色) * 聚光灯效果 * 衰减因子