XNA Shader编程教程5-变形

在前面的几个教程中我们介绍了几个光照算法,今天的教程相对比较短,是一个纯粹的vertex shader效果使物体变形。

程序截图

使物体变形

由于vertex shader可以逐顶点地转换顶点,所以可以用来使物体/网格发生变形。举例来说,如果一个游戏能够让你创建自己的角色,包括改变皮肤颜色,眼睛颜色,头发,衣服等,我们就可以创建一个vertex shader设置角色的体形属性,将这个属性设为0说明它“瘦”而1说明“胖”。

胖/瘦

要实现这个功能,我们只需一个vertex shader让顶点沿着法线移动。如果我们将所有的顶点沿着法线移动,则物体将会变得更大或更小。

胖/瘦

海浪

你也可以不用制作一个很大的骨骼动画网格去创建一个逼真的海面,而可以用一个vertex shader代替。要做到这一点,你需要一个很大的平面网格代表平静的海面。你可以在3ds中制作,或编程实现。这会需要许多顶点,而shader会根据正弦/余弦函数向上或向下移动这些顶点。

海浪

如图所示,我们定义了一个有很多顶点的平面。并使用Vertex Shader将所有顶点沿Y轴方向遵循正弦函数移动,可表示为:

f(y)=sin(y)

就是说顶点X是随pos.Y = sin(X.pos+time)这个规律运动的。这将产生海面的波浪。当然,现在还很简单,不是很漂亮。海面的实现有许多种不同的算法,所以如果你想深入研究,可在goolge上搜索一下。要使海浪更漂亮,你可以设置一个法线贴图在海面的大波浪上创建一些小的凹凸,也可以组合正弦波和余弦波制作更真实的海浪。

模拟谐振球

这就是这个教程要实现的东西,相当于瘦/胖算法和海浪算法的组合。该示例将使用一个球体对象,并设置一种正弦/余弦函数使顶点沿法线方向移动使其基于时间而变形。

程序截图

实现Shader

这个shader只是一个Vertex Shader。pixel shader只处理基本光照使其看起来更真实。您可以自己添加法线映射获得更酷的效果。

在这个shader中需要一个时间变量,这样我们可以根据时间制作一个动画效果,然后我们只需设置大量的正弦和余弦函数使其看起来很酷。下面是Vertex Shader代码:

float4 g_fTime; OUT VS(float4 Pos : POSITION, float3 N : NORMAL)
{
    OUT Out = (OUT)0;
    float angle=(g_fTime%360)*2; 
    float freqx = 1.0f+sin(g_fTime)*4.0f; 
    float freqy = 1.0f+sin(g_fTime*1.3f)*4.0f; 
    float freqz = 1.0f+sin(g_fTime*1.1f)*4.0f; 
    float amp = 1.0f+sin(g_fTime*1.4)*30.0f; 
    float f = 	sin(N.x*freqx + g_fTime) * sin(N.y*freqy + g_fTime) * sin(N.z*freqz + g_fTime); 
    Pos.z += N.z * amp * f; 
    Pos.x += N.x * amp * f; 
    Pos.y += N.y * amp * f; 
    Out.Pos	= mul(Pos, matWorldViewProj); 
    Out.N = mul(N, matWorld); 
    float4 PosWorld = mul(Pos, matWorld); 
    Out.L = vecLightDir; 
    Out.V = vecEye - PosWorld; 
    return Out; 
} 

Shader计算了振度和频率以找到一个平滑值,而顶点可以移动到这个点上。

使用Shader

这里没有新的东西。我们只向shader传递了一个g_fTime变量。


发布时间:2009/4/7 上午9:45:30  阅读次数:9261

2006 - 2024,推荐分辨率 1024*768 以上,推荐浏览器 Chrome、Edge 等现代浏览器,截止 2021 年 12 月 5 日的访问次数:1872 万 9823 站长邮箱

沪 ICP 备 18037240 号-1

沪公网安备 31011002002865 号