胡说八道

学而不思则罔,思而不学则殆

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  132 随笔 :: 0 文章 :: 58 评论 :: 1 Trackbacks
想法是基于Parallax Mapping,首先计算在TextureSpace中的ViewDir,然后根据这个ViewDir和假设的多个TextureLayer的高度偏移计算出每个Texture的坐标偏移.
这样就能在一个平面上作出能根据视点的变化来模拟多个层次的草.





上面的三张图是使用了3层Texture的三个角度的截图,注意红色框内的草在不同的角度观察下的情况.

posted on 2005-07-18 00:13 胡说八道 阅读(920) 评论(1)  编辑 收藏 所属分类: 自己的作品

评论

#1楼  2005-07-19 17:12 sevecol [未注册用户]
hlsl:

struct VS_INPUT
{
float4 Pos : POSITION;
float3 Normal : NORMAL;
float3 TexCoord : TEXCOORD0;
float3 Tangent : TEXCOORD1;
};

struct VS_OUTPUT
{
float4 Pos : POSITION;
float2 TexCoord : TEXCOORD0;
float3 TexSpaceView: TEXCOORD1;
};


VS_OUTPUT GrassVS(VS_INPUT i)
{
VS_OUTPUT o;

float4 t_pos=mul(float4(i.Pos,1),WorldMatrix[i.TexCoord.z]);

//if (i.TexCoord.y<0.15)
//{
//t_pos.xyz+=winddir*cos(Times*Offset[i.TexCoord.z].x);
//}

o.Pos = mul(t_pos,ViewProj);

o.TexCoord=i.TexCoord.xy;
float3x3 TangentSpace=GetTangentSpaceBasis(i.Tangent.xyz, i.Normal.xyz);
o.TexSpaceView = mul(TangentSpace, t_pos.xyz-EyePos);

return o;
}

float4 GrassPS(VS_OUTPUT i) : COLOR
{
float4 color=float4(0,0,0,0);

float4 color1 = tex2D(diffuse1, i.TexCoord);
float4 color2 = tex2D(diffuse2, i.TexCoord+0.1f*i.TexSpaceView.xy);///i.TexSpaceView.z);
float4 color3 = tex2D(diffuse3, i.TexCoord+0.2f*i.TexSpaceView.xy);///i.TexSpaceView.z);

//float3 normals = normalize((tex2D(normal, i.TexCoord).xyz * 2.0f) - 1.0f);

color = lerp(color2,color3,1-color2.a);
color = lerp(color1,color,1-color1.a);

return color;
}
  回复  引用  查看    


标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
 
另存  打印
最新IT新闻:
· 雅虎首页大变脸 阿里风格上身
· 万名Linux使用者向暴雪请愿Linux版《Diablo III》
· 56.com我乐网将全面转行 退出视频行业
· Joost借道TOM在线 将正式进军中国
· 微软副总裁公开承认Vista存在问题