文档章节

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

FuniK
 FuniK
发布于 2013/12/26 22:12
字数 682
阅读 151
收藏 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
游戏引擎--Urho3D

Urho3D 是用 C++ 实现的一个轻量型、跨平台的 2D 和 3D 游戏引擎,灵感来自 OGRE 和 Horde3D。 特性: Direct3D9, Direct3D11v1.4, OpenGL 2.0 or 3.2v1.4, OpenGL ES 2.0 或 WebGLv1.4 渲染...

sikkx
2015/06/16
4.9K
0

没有更多内容

加载失败,请刷新页面

加载更多

防止快速重复点击的两种思维

防止重复执行的两种思维 场景 下单时,提交按钮,因为网络卡顿或者手快重复点击,导致重复提交订单; 微博,更新个人状态或发表评论时,快速多次点击[发送]按钮,导致相同的信息发送多次. 解决思路 ...

黄威
12分钟前
0
0
在windows环境下使用Virtualbox虚拟Debian系统来运行Docker

标题绕口。 我之前一直使用 Virtualbox 和 homestead 来运行我的 PHP 开发环境。最近决心开始尝试 DevOps,使得开发、部署容器化,来化解人为操作失误和环境不兼容等问题造成的各种损失。就打...

zgldh
14分钟前
0
0
python map()

map()函数 map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回。(利用生成器的原理,并不马上返回值,...

南桥北木
28分钟前
0
0
分享几个 SpringBoot 实用的小技巧

前言 最近分享的一些源码、框架设计的东西。我发现大家热情不是特别高,想想大多数应该还是正儿八经写代码的居多;这次就分享一点接地气的: SpringBoot 使用中的一些小技巧。 算不上多高大上...

Java干货分享
28分钟前
0
0
day123-20181021-英语流利阅读-待学习

这款新字体,比记忆面包还管用 Lala 2018-10-21 1.今日导读 字体能跟学习效果有什么关系?你还别说,来自澳洲的心理学家和设计师们,还真创造了一款号称能够帮助大家记忆信息、增强学习效果的...

飞鱼说编程
40分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部