黎明的剔透里伸出了你沁清的暧昧

Graphics|EngineDev|GameDev|2D&3D Art

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  60 随笔 :: 1 文章 :: 18 评论 :: 0 Trackbacks
Cook Torrance 模型将物体粗糙表面看做很多微小平面组成,每一个微小平面都被看做一个理想的镜面反射,物体表面粗糙程度由微平面斜率的变化来衡量,一个粗糙表面由一些列斜率变化很大的微平面组成,而相对平滑的微平面斜率变化很小,
Vertex shader:
 1uniform vec3 lightposition;//光源为位置
 2uniform vec3 eyeposition;//相机位置
 3varying float  NdotL, NdotH, NdotV, VdotH ;
 4void 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:
 1uniform sampler2D tex;
 2uniform vec4 ambient;//环境光颜色
 3uniform vec4 DiffuseLightColor;//漫反射光源颜色
 4uniform vec4 SpecularLightColor;//specular光源颜色
 5varying float NdotL, NdotH, NdotV, VdotH ;
 6float diff=0.1;
 7float spec=1.0;
 8void main(void){  
 9    float m = 0.6;//物体表面粗超程度
10    float f0 = 0.9;//入射角接近0时候的菲涅尔反射系数
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系数的设置对反射的亮度有一定的影响。  此处设置的比较大,一般近似取f0=pow((1.0 - VdotH), 4.0);
Effect:
Object1

object2

posted on 2012-03-05 19:08 情绝格调(fresmaster) 阅读(2631) 评论(2)  编辑 收藏 引用 所属分类: Graphics

评论

# re: GLSL.Cook Torrance Model 2013-02-18 23:54 杯具Graphic
vec3 specular = spec * vec3(SpecularLightColor) * Rs;
这句有错啊,应该再乘一个 NdotL ,看了很多资料我就为了验证某“阳春白雪下里巴人”上的错误...路过这顺便纠正下  回复  更多评论
  

# re: GLSL.Cook Torrance Model 2013-04-11 12:28 情绝格调(fresmaster)
应该不用再乘NdotL了吧,乘NdotL的意义何在?Cook-Torrance 光照模型和经典光照模型的本质区别在于使用不同的方法计算镜面反射光的双向反射率,Rs在计算过程中有一个除以NdotL的过程@杯具Graphic  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理