文档章节

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

FuniK
 FuniK
发布于 2013/12/26 22:12
字数 682
阅读 153
收藏 3

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


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

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

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


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


接下来就可以去添加代码了,这次只是仅仅涉及顶点的移动,因而我们只需要考虑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的坐标系中的位置

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

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


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

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

© 著作权归作者所有

共有 人打赏支持
FuniK
粉丝 4
博文 37
码字总数 10626
作品 0
崇明
程序员
私信 提问
HLSL学习实践记录: RenderMonkey实现(一):显示出模型和贴图

之前写过一篇 初学RenderMonkey做一面旗帜飘动的效果 其实当时完全是心血来潮初步接触了一下,感觉特别酷,为了在mod里秀一下,对于HLSL没有太多概念。 之后就搁置了,现在重新拾起来,决定认...

FuniK
2013/12/25
0
0
初学RenderMonkey做一面旗帜飘动的效果

这几天在捣鼓一个游戏 骑马与砍杀 不知道有没有人玩过。官方出了个shader包,可以自定义shader,于是就开始学起来了,学了一点,简单的实现了一直想弄的动态世界。这期间一直在用RenderMonke...

FuniK
2013/01/06
0
11
HLSL学习实践记录: RenderMonkey实现(三):天空盒子

我们在游戏里看到的天空实际上就是一个天空盒子,一般可能是圆球状的,然后贴上各种天空贴图,从而模拟一种天空的效果。 当然,现在已经很少有游戏做那种单一的静态天空盒子,这样天空明显比...

FuniK
2014/01/07
0
0
[Unity Shader] Shader学习笔记2 - 概述2

Unity 有三种编写shader的方式: surface shaders, vertex and fragment shaders, fixed function shaders. fixed function shader (固定功能着色器): 对应于固定管线硬件的操作,最简单的...

NickHomeSelf
2016/08/07
3
0
使用RenderMonkey 开发opengl-es shader程序,如何传入顶点数据?

在使用rendermonkey开发着色器程序的时候,如果将顶点数据传入到 rendermonkey 中,有多个顶点。 在上层定义顶点数据的时候使用的是 float[] 写入了一个 输出缓冲流中,在 rendermonkey 模拟...

Jping
2012/12/20
930
0

没有更多内容

加载失败,请刷新页面

加载更多

GROUP BY GROUPING SETS

GROUPING SETS 子句是 SELECT 语句的 GROUP BY 子句的扩展。通过 GROUPING SETS 子句,您可采用多种方式对结果分组,而不必使用多个 SELECT 语句来实现这一目的。这就意味着,能够减少响应时...

hblt-j
11分钟前
0
0
selenium之表格的定位

真的勇士, 敢于直面惨淡的warning、 敢于正视淋漓的error 目录 被测试网页的HTML代码 1.遍历表格所有单元格 2.定位表格中的某个元素 3.定位表格中的子元素 总结 浏览器网页常常会包含各类表...

程序猿拿Q
16分钟前
0
0
adb命令启动展讯平台工厂模式

adb命令启动展讯工厂模式: adb shell am start com.sprd.engineermode/com.sprd.engineermode.EngineerModeActivity...

东街小霸王
17分钟前
0
0
mtu值怎样设置才网速最快

一、什么是 MTU 值 1 从字面上来说,MTU 是英文 Maximum Transmission Unit 的缩写,即最大传输单元,它的单位是字节。 在我们常用的以太网中,MTU 一般是 1500,而无线路由器默认一般是 14...

Clarence_D
35分钟前
1
0
McAfee阻止邮件发送功能

自己写的邮件发送功能,在本地机器上可以发送,但是放到服务器上面之后就不能发送了,捕获到的异常是“以一个访问权限不允许的方式做了一个访问套接字的尝试”,找了很久,终于发现是被McAfe...

壹峰
40分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部