K(L*N);
Shader例子:
-
vec3normal; //光照平面的法线 V
-
- vec3position; //光源位置 P
-
- float dotVP; //法线和光源向量点乘值
-
- float diffause; //光的漫反射颜色
-
-
dotVP =dot(normal, position); //向量点乘
-
-
dotVP =max(dotVP, 0); //当法线和光源向量夹角为顿角的就没有光照了.
-
-
floatDiffause = diffause*dotVP; //漫反射结果(没有加距离衰减)
vec3normal; //光照平面的法线 V
vec3position; //光源位置 P
float dotVP; //法线和光源向量点乘值
float diffause; //光的漫反射颜色
dotVP =dot(normal, position); //向量点乘
dotVP =max(dotVP, 0); //当法线和光源向量夹角为顿角的就没有光照了.
floatDiffause = diffause*dotVP; //漫反射结果(没有加距离衰减)
三:镜面反射
相信大家小时候玩过镜子,镜子反射光时会很耀眼,镜面反射会形成强烈的光反射,反射的路线与入射方向
和表面法线形成的反射方向保持一致,镜面反射依赖于观察者所处的位置.当反射方向指向观察者时,光线最强,当反射光线离开观察者时,光线强度呈指数下降;
镜面反射公式推导:
具体公式推导过程:如图所示,
V: 观察者, R: 反射光线, N:法线, L: 入射光线; S: 反射颜色,
C:入射光强度,m镜面指数;
http://img.blog.csdn.net/20150127185449140?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemFuZ2xlMjYw/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
镜面指数m控制镜面强光的集中程度, 小的m值产生模糊的强光, 大的m值产生明显的强光.
一个对镜面强光进行描述的可信模型:
镜面反射值 = S*C*(max(R*V,0)^m), 条件是(N*L>0);
这个模型的含义是, 当光线与法线成锐角时, 观察者能接收到反射光线,
并且强度随着发射光线与观察者夹角成指数变化.
虽然这个模型能计算出镜面反射, 每一次计算,都涉及到反射光线, 但实际中,反射光线可能有无数条, 计算量太大,
能否有一种简化模型呢.
一种办法是, 在光源位置向量与观察者向量, 取一个中间向量, 叫做平分向量H, 如图所示:
http://img.blog.csdn.net/20150127190545765?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemFuZ2xlMjYw/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
当H和法线N重合时, 反射到观察者的光线最近, 当H和法线N角度变大时,光线减弱.
由此,调整反射模型为:
镜面反射值 =
S*C*(max(H*N,0)^m), 条件是(N*L>0)
Shader例子:
-
vec3normal; //光照平面的法线V
-
- vec3halfVector; //光线平分向量方向H,含义参见上一篇博客
-
- floatdotHV; //法线和光线点乘值
-
- floatshininess; //镜面指数,控制镜面强光集中度
-
- floatspecular; //镜面反射颜色
-
-
dotHV= dot(normal, halfVector); //光线平分向量与法线点乘
-
-
dotHV= max(0, dotHV);//夹角呈顿角按0值处理
-
-
floatpf = 0.0;//光线反射强度
-
-
pf= pow(dotHV, shininess);
-
-
specular= specular * pf; //反射结果(没有加距离衰减)
vec3normal; //光照平面的法线V
vec3halfVector; //光线平分向量方向H,含义参见上一篇博客
floatdotHV; //法线和光线点乘值
floatshininess; //镜面指数,控制镜面强光集中度
floatspecular; //镜面反射颜色
dotHV= dot(normal, halfVector); //光线平分向量与法线点乘
dotHV= max(0, dotHV);//夹角呈顿角按0值处理
floatpf = 0.0;//光线反射强度
pf= pow(dotHV, shininess);
specular= specular * pf; //反射结果(没有加距离衰减)