先介绍颜色计算
8位格式 可表示颜色范围在0 ~ 255
RGB格式 3个分量(r, g, b)的颜色范围在 0 ~ 255
浮点格式 3个分量(r, g, b)的颜色范围在 0.0f ~ 1.0f
颜色加法: C1( r1, g1, b1 ),C2( r2, g2, b2 )
Csum = C1 + C2 = ( r1+r2, g1+g2, b1+b2 )
当两个数想加范围超过255时,取得大的那个值作为颜色分量的结果
颜色乘法(颜色调制): C1( r1, g1, b1 ),C2( r2, g2, b2 ),k(实数)
Cmodulated = C1 * k = ( r1*k, g1*k, b1*k ) (亮度值)
k = 1时,表示颜色亮度不变,k = 2时,表示亮度增大2倍,k = 0.2时,表示亮度缩小2倍
当范围超过255时,直接取255作为结果
一般情况下C1分量范围在(1 ~ 0.0f )
Cmodulated = C1*C2 = ( r1*r2, g1*g2, b1*b2 )
当范围超过255时,直接取255作为结果
其次是必须说明的材质类型
( 材质的意思:在渲染程式中,它是表面各可视属性的结合,这些可视属性是指表面的色彩、纹理、光滑度、透明度、反射率、折射率、发光度等 )
符号 | 说明 |
Mamb | 环境材质颜色 |
Mdiff | 漫反射材质颜色 |
Mspec | 镜面反射材质颜色 |
Mshi | 材质本身发光光亮度参数 |
Memi | 反射性材质颜色 |
接着就是说明光源
( 光类型的作用就是,对不同类型对不同材质上所表型的不同光强 )
符号 | 说明 |
Samb | 环境强度颜色 |
Sdiff | 漫反射强度颜色 |
Sspec | 镜面反射强度颜色 |
Spos | 光源位置 |
分量代表的意思:每个材质上的像素点
漫反射分量:
理论部分:反射,是投射在粗糙表面上的光向各个方向反射的现象。当一束平行的入射光线射到粗糙的表面时,表面会把光线向着四面八方反射,所以入射线虽然互相平行,由于各点的法线方向不一致,造成反射光线向不同的方向无规则地反射,这种反射称之为“漫反射”或“漫射”。
此图片取自百度,若有侵权立马删除
一下是计算一个反射分量的公式
此图片取自《real - time rendering 》第二版,如有侵权立马删除
其中n代表物体表面法线
I代表光向量( 反射向量 ),I和n的夹角不能超过90度
Idiff = ( n · i )*Mdiff * Sdiffn ( n · i 是 向量点乘,而Mdiff * Sdiffn则是漫反射材质颜色*漫反射强度颜色 )
镜面反射分量:
理论部分:
第一,反射光线与入射光线分局法线两侧,并在在同一平面内;第二,反射角等于入射角.
此图片取自《3D游戏编程大师技巧》,如有侵权立马删除
v= 视点角,r = 反射向量, Mshi = 物体自身光亮度 (这个值呈指数增长的时候物体上的那个光斑会越来越大)
光斑图
此图片取自《3D数学基础》,如有侵权立马删除
Ispec = (( r · v )^Mshi)*( Mspec * Sspec ), ( r · v 是 向量点乘,而Mspec * Sspec则是镜面反射材质颜色*镜面反射强度颜色 )
镜面反射分量的优化计算方式:
简化理由:为了提高速度,由于计算反射向量r过于耗时,(DX和openGL计算方式)
《real - time rendering 》第二版,如有侵权立马删除
没错,这里不再计算反射向量r,而是直接计算视见向量V+光向量I = h向量
Ispec = (( h·n )^Mshi) * ( Mspec*Sspec ),(h· n 是 向量点乘,而Mspec * Sspec则是镜面反射材质颜色*镜面反射强度颜色 )
环境反射分量:
理论部分:从光源散发的光线可能会在一个物体表面产生反射并达到另一个物体
Iamb = Mamb * Samb , ( Mamb*Samb是环境材质颜色*环境强度颜色 )
光源类型:
定向光(平行光):
理论部分:
平行光是指光在传播途中其波前始终保持是一个平面的光束!
此图片取自《3D游戏编程大师技巧》如有侵权立马删除
1.没有具体位置(无穷远)
2.光强不跟随距离发生变化
3.有方向
4.有颜色
5.有光源强度
I(D)dir = IOdir * CLdir,(IOdir = 光源初始强度,CLdir = 光源颜色)
点光源:
理论部分:
点光源是理想化 为质点的向四面八方发出光线的光源此图片取自《3D游戏编程大师技巧》如有侵权立马删除
1.有具体位置
2.光强发生变化
3.没有方向
4.有颜色
5.有光源强度
I(D)point = ( IOpoint * CLpoint ) / ( Kc + Ki*d +Kq *d*d )
d = |p - s|,表示点光源的位置减去物体表面点的位置
IOpoint = 光源初始强度,CLdir = 光源颜色
Kc = 常量衰减因子,Ki = 线性衰减因子,Kq = 二次衰减因子
聚光灯:
理论部分:
聚光灯使用聚光镜头或反射镜等聚成的光
此图片取自《3D游戏编程大师技巧》如有侵权立马删除
1.有具体位置
2.光强发生变化
3.有方向
4.有颜色
5.有光源强度
6.增加内锥角(影响光强)
7.增加外锥角(影响光强)
8.Power总体光强
是否计算物体上某一点光亮条件:
1.如果物体上的某一点在外锥角的范围外,不进行计算
公式如下:I( D )spotlight = 0
2.如果物体上的某一点在内锥角范围内,只使用距离衰减因素,不考虑其他衰减因素
公式如下:I( D )spotlight = ( IOspotlight * CLspotlight ) / ( Kc + Ki*d + Kq * d*d )
3.如果物体上的某一点在内锥角外且在外锥角内,即使用距离衰减因素,有考虑其他衰减因素
公式如下:I( D )spotlight = ( IOspotlight * CLspotlight ) / ( Kc + Ki*d + Kq * d*d ) * A
A = ( cosθ - cosΦ )*pf / ( cosα - cosΦ ) pf = 指数因子=总体光强,α=内锥角的二分之一,Φ=外锥角的二分之一,θ=Φ - α