Heath's Blog

There is no end, it is just the beginning! - A Game Developer's Notes

Generate Realistic Water based on multiple Normal maps

    基于Berlin噪声算法可以产生真实的水面效果,然而由于需要动态生成相应的normal map,所以效率较低。
    昨天和同事讨论时,产生一个想法:采用多张静态normal maps和纹理动画。实验了一下效果还不错。笔者使用下图所示的两张法线贴图:
    在ps中对根据时间对纹理坐标进行改变,而后对两张normal map进行采样取平均,下面为具体代码和效果图:
float3 GetMaterialNormal(MaterialParameters Parameters)
{
    float2 texCoords 
= Parameters.TexCoords;
    texCoords.x 
+= g_fTime / 100;
    texCoords.y 
+= g_fTime / 50;
    float3 normal1 
= (2 * tex2D(g_Sampler0 , texCoords) - 1.0f).xyz;
    
//texCoords = Parameters.TexCoords / 2.0f;
    texCoords.x -= g_fTime / 50;
    texCoords.y 
-= g_fTime / 100;
    float3 normal2 
= (2 * tex2D(g_Sampler1 , texCoords) - 1.0f).xyz;
    float3 normal 
= (normal1 + normal2) / 2.0f;
    float3x3 TBN;
    TBN[
0]    =    Parameters.vTangent;
    TBN[
1]    =    Parameters.vBinormal;
    TBN[
2]    =    Parameters.vNormal;
    
return mul(normal , TBN);    
}


带环境反射的水面效果

    P.S. 在MMOG中normal map制造水面足矣,在有效减少vertex的同时提高效率。

posted on 2008-12-06 16:06 Heath 阅读(2304) 评论(1)  编辑 收藏 引用 所属分类: Graphics Programming

Feedback

# re: Generate Realistic Water based on multiple Normal maps 2008-12-06 17:39 Bill Hsu

cool  回复  更多评论   


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