GLSL.Projective Texture Mapping

GLSL.Projective Texture Mapping
Projective Texture:shadow的基础 在fixed function pipline中启动自动生成贴图坐标功能后,用object linear模式或者eye linear模式来设置纹理参数, 这样就可以把纹理从眼睛的观察方向投射到场景中去,如果要从光源方向投射纹理,就要使用glActiveTextureARB首先把那一层的纹理单元激活,然后载入光源方向的透视观察矩阵,最后别忘了glEnable(GL_TEXTUREn_ARB).
在shader中我们可以简化这些操作:
投影纹理映射真正的流程是 “ 根据投影机(视点相机)的位置、投影角度,物体的坐标,求出每个顶点所对应的纹理坐标,然后依据纹理坐标去查询纹理值 ” ,也就是说,不是将纹理投影到墙上,而是把墙投影到纹理上。投影纹理坐标的求得,也与纹理本身没有关系,而是由投影机的位置、角度,以及 3D 模型的顶点坐标所决定
.projtexcoord=偏移矩阵 * 光源投影矩阵 * 光源观察矩阵 * 建模矩阵 ( Cg Tutorial
这个流程和一般我们渲染时的管线差不多
NDC的范围为[-1,1],而纹理坐标是[0,1],所以我们要有一个偏移矩阵,可以用乘以0.5再加上0.5来计算,效果是一样的。
在shader上实现没有使用fixed function pipline那样繁琐,使用前面已经用到的Bank BRDF anisotropy 光照来渲染
Vertex Shader:
 1 uniform vec3 lightposition;
 2 uniform vec3 eyeposition;
 3 uniform mat4 texMatrix;
 4 varying  float   NdotL, NdotH, NdotV, VdotH, LdotT, VdotT;
 5 varying vec4 projtexcoord;
 6 void  main( void ) {
 7    
 8    vec3 objPosition = vec3 (gl_ModelViewMatrix * gl_Vertex);
 9    vec3 Normal = normalize (gl_NormalMatrix * gl_Normal);
10    vec3 LightDir = normalize (lightposition - objPosition);
11    vec3 EyeDir = normalize (eyeposition - objPosition);
12    vec3 HalfVec = normalize (LightDir + EyeDir);
13    
14    vec3 TangVec = normalize(cross(Normal, EyeDir));
15
16    NdotL = max(dot(Normal, LightDir), 0.0);
17    LdotT = max(dot(LightDir, TangVec), 0.0);
18    VdotT = max(dot(EyeDir, TangVec), 0.0);
19
20    projtexcoord = texMatrix*vec4(objPosition,1.0);
21    projtexcoord = 0.5 * (projtexcoord + 1.0);
22
23    gl_Position = ftransform();
24}

Frag  Shader:
 1 uniform vec4 ambient;
 2 uniform vec4 DiffuseLightColor;
 3 uniform vec4 SpecularLightColor;
 4 uniform  float  shininess;
 5 uniform sampler2D ProjectiveTexture;
 6 varying  float  NdotL, NdotH, NdotV, VdotH, LdotT, VdotT ;
 7 varying vec4 projtexcoord;
 8
 9 float  diff = 0.1 ;
10 float  spec = 1.0 ;
11 void  main( void )
12     float sqrt1 = sqrt(1.0 - pow(LdotT, 2.0));
13     float sqrt2 = sqrt(1.0 - pow(VdotT, 2.0)); 
14     float Rs=sqrt1*sqrt2 - LdotT*VdotT;
15     vec3 diffuse = diff * vec3(DiffuseLightColor) * NdotL;
16     float BRDF = spec * pow(Rs,shininess);
17     vec3 specular =BRDF *vec3(SpecularLightColor) * NdotL;
18 
19     vec4 Color = vec4((diffuse + specular),1.0); 
20     Color =Color+ ambient;
21 
22     vec4 texcolor=texture2DProj(ProjectiveTexture,projtexcoord );
23
24     gl_FragColor =Color * texcolor;
25}

effect:
object1:
GLSL.Projective Texture Mapping_第1张图片

object2:
GLSL.Projective Texture Mapping_第2张图片

object3:
GLSL.Projective Texture Mapping_第3张图片

参考:
http://blog.csdn.net/pizi0475/article/details/6714826
http://blog.csdn.net/pizi0475/article/details/6714813


你可能感兴趣的:(GLSL.Projective Texture Mapping)