HLSL学习实践记录: RenderMonkey实现(二):飘动的实现---模型顶点的移动

依然是上次就已经做过的内容,所以第二篇来的很快。


首先动态需要一个时间的概念,时间不同也就不存在动态效果了。

因而首先需要添加一个时间变量,在RenderMonkey有一系列预定义变量,比如我们刚创建完一个项目就能看matViewProjection这个变量,就是一个预定义变量,这是一个世界,观察,投影的合矩阵,在Vertex Shader中我们模型顶点位置向量需要与这个矩阵相乘完成坐标转换才能使模型出现在预览窗口。关于这几个矩阵,可以参看这篇博客的详解

http://www.cnblogs.com/kex1n/archive/2011/08/19/2145866.html


回到我们的时间变量,添加系统的预定义时间变量fTime0_X,之后我重命名成了time

HLSL学习实践记录: RenderMonkey实现(二):飘动的实现---模型顶点的移动_第1张图片


接下来就可以去添加代码了,这次只是仅仅涉及顶点的移动,因而我们只需要考虑Vertex Shader即可

float4x4 matViewProjection;
float time;

struct VS_INPUT 
{
   float4 Position : POSITION0;
   float2 TexCoord : TEXCOORD0;
   
};

struct VS_OUTPUT 
{
   float4 Position : POSITION0;
   float2 TexCoord : TEXCOORD0;  
   
};

VS_OUTPUT vs_main( VS_INPUT Input )
{
   VS_OUTPUT Output;
   
   float banner_x=0.04f;
   float banner_z_min=1.1f;
   float banner_z_max=2.2f;    
   
   if((Input.Position.x>banner_x)&&(Input.Position.z>banner_z_min)&&(Input.Position.z<banner_z_max))
      Input.Position.y = Input.Position.y+0.5*Input.Position.x*sin(2*time+Input.Position.z);

   Output.Position = mul( Input.Position, matViewProjection );
   Output.TexCoord=Input.TexCoord;
   
   return( Output );
   
}

首先我们需要声明这个时间变量time,之后去到vs_main函数里修改顶点的位置

这里的模型依然是上一篇中的旗帜,显然我们只需要移动旗面的顶点,旗杆是固定不动的。

所以我们用最简单的坐标范围来判断那些顶点需要移动。

具体每个顶点的坐标数值可以去建模工具内查看。需要注意的一点是坐标的不同。

仅仅是左右手坐标系的不同可以右键你的模型->Orientation来切换左右手坐标系。

但是如果是模型摆放都出现了差别就需要自己稍微看一下。

如下两图,同一个模型在RM和3DMAX的坐标系中的位置

HLSL学习实践记录: RenderMonkey实现(二):飘动的实现---模型顶点的移动_第2张图片HLSL学习实践记录: RenderMonkey实现(二):飘动的实现---模型顶点的移动_第3张图片

确定范围之后就可以去让范围内的旗帜沿着旗帜的法线方向做周期运动了

这里使用了sin函数来做基本的周期运动,顶点的X坐标作为振幅,Z坐标作为相位,这样旗帜就飘动的相对自然一点。

HLSL学习实践记录: RenderMonkey实现(二):飘动的实现---模型顶点的移动_第4张图片


不过这样机械化的飘动其实还是不自然, 能更随机化一点才真实,以后看看有什么好办法。

下一篇应该是做一个天空盒子的渐变,也是之前做过的,都整理一下。

你可能感兴趣的:(HLSL学习实践记录: RenderMonkey实现(二):飘动的实现---模型顶点的移动)