Cook Torrance 模型將物體粗糙表面看做很多微小平面組成,每一個微小平面都被看做一個理想的鏡面反射,物體表面粗糙程度由微平面斜率的變化來衡量,一個粗糙表面由一些列斜率變化很大的微平面組成,而相對平滑的微平面斜率變化很小,
Vertex shader:
1
uniform vec3 lightposition;//光源為位置
2
uniform vec3 eyeposition;//相機位置
3
varying float NdotL, NdotH, NdotV, VdotH ;
4
void main(void)
{
5
6
vec3 objPosition = vec3 (gl_ModelViewMatrix * gl_Vertex);
7
vec3 Normal = normalize (gl_NormalMatrix * gl_Normal);
8
vec3 LightDir = normalize (lightposition - objPosition);
9
vec3 EyeDir = normalize (eyeposition - objPosition);
10
vec3 HalfVec = normalize (LightDir + EyeDir);
11
12
NdotL = max(dot(Normal, LightDir), 0.0);
13
NdotH = max(dot(Normal, HalfVec), 0.0);
14
NdotV = max(dot(Normal, EyeDir), 0.0);
15
VdotH = max(dot(EyeDir, HalfVec), 0.0);
16
17
gl_Position = ftransform();
18
} Frag Shader:
1
uniform sampler2D tex;
2
uniform vec4 ambient;//環(huán)境光顏色
3
uniform vec4 DiffuseLightColor;//漫反射光源顏色
4
uniform vec4 SpecularLightColor;//specular光源顏色
5
varying float NdotL, NdotH, NdotV, VdotH ;
6
float diff=0.1;
7
float spec=1.0;
8
void main(void)
{
9
float m = 0.6;//物體表面粗超程度
10
float f0 = 0.9;//入射角接近0時候的菲涅爾反射系數(shù)
11
12
float Fresnel = f0 + (1.0 - f0) * pow((1.0 - VdotH), 5.0);
13
float Droughness = (pow(NdotH, 2.0)-1.0) / (m * m * pow(NdotH,2.0));
14
float Drough = (1.0 / m * m * pow(NdotH,4.0)) * exp(Droughness);
15
float G1 = (2.0 * NdotH * NdotL) / VdotH;
16
float G2 = (2.0 * NdotH * NdotV) / VdotH;
17
float Geometric= min(1.0, min(G1, G2));
18
19
float Rs = (Fresnel * Drough * Geometric) / (NdotV * NdotL);
20
21
vec3 diffuse = diff * vec3(DiffuseLightColor) * NdotL;
22
vec3 specular = spec * vec3(SpecularLightColor) * Rs;
23
24
vec4 Color = vec4((diffuse + specular),1.0);
25 gl_FragColor = Color;
26
} f0系數(shù)的設置對反射的亮度有一定的影響。 此處設置的比較大,一般近似取f0=
pow((1.0 - VdotH), 4.0);
Effect:
Object1