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

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

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  60 随笔 :: 1 文章 :: 18 评论 :: 0 Trackbacks
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:
 1uniform vec3 lightposition;
 2uniform vec3 eyeposition;
 3uniform mat4 texMatrix;
 4varying float  NdotL, NdotH, NdotV, VdotH, LdotT, VdotT;
 5varying vec4 projtexcoord;
 6void 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:
 1uniform vec4 ambient;
 2uniform vec4 DiffuseLightColor;
 3uniform vec4 SpecularLightColor;
 4uniform float shininess;
 5uniform sampler2D ProjectiveTexture;
 6varying float NdotL, NdotH, NdotV, VdotH, LdotT, VdotT ;
 7varying vec4 projtexcoord;
 8
 9float diff=0.1;
10float spec=1.0;
11void 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:

object2:

object3:

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


posted on 2012-03-09 03:00 情绝格调(fresmaster) 阅读(4215) 评论(3)  编辑 收藏 引用 所属分类: Graphics

评论

# re: GLSL.Projective Texture Mapping 2015-05-05 21:01 Zi_菜
您好,我想看看实例的代码,请问可以给我一份么?  回复  更多评论
  

# re: GLSL.Projective Texture Mapping 2015-05-05 21:15 Zi_菜
如果方便的话,我的邮箱是lacp7723413@163.com  回复  更多评论
  

# re: GLSL.Projective Texture Mapping 2016-08-11 10:42 www.czgo.net
《环球头条网》www.czgo.net在这里我们为您提供全国各地以及国内外最新的新闻快讯内容、新闻、时事热点新闻,网涵盖了国内外各大报社,包括国内外社会,军事,财经,娱乐,体育,汽车,科技,房产,教育,游戏,旅游,奇闻趣事,美女图库等各个领域多个栏目的新闻资讯。环球头条网是一个全面展现社会万象、人生百态的新闻资讯网。  回复  更多评论
  


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