文档章节

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

FuniK
 FuniK
发布于 2013/12/26 22:12
字数 682
阅读 148
收藏 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

没有更多内容

加载失败,请刷新页面

加载更多

下一页

@SpringBootApplication 注解

@SpringBootApplication注解是一个组合注解,包含以下注解 @Target(ElementType.TYPE) 注解的作用目标 @Retention(RetentionPolicy.RUNTIME) Reteniton的作用是定义被它所注解的注解保留多久,...

java.刘
33分钟前
0
0
sentinel自定义DataSource实战

序 本文主要研究一下如何自定义sentinel的DataSource,这里以jdbc为例。 maven <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-sen......

go4it
48分钟前
1
0
xgboost/gbdt在调参时为什么树的深度很少就能达到很高的精度?

问题: 用xgboost/gbdt在在调参的时候把树的最大深度调成6就有很高的精度了。但是用DecisionTree/RandomForest的时候需要把树的深度调到15或更高。用RandomForest所需要的树的深度和Decisio...

tantexian
50分钟前
0
0
php-fpm的pool - 慢执行日志 - 进程管理 - open_basedir

php-fpm的pool : 为避免多站点使用同一个pool时因一个站点故障导致php资源耗尽,牵连使用同一个pool的其他站点的正常工作,可对每一个站点设置独立pool。 增加pool: 1.编辑php-fpm配置文件...

ZHENG-JY
今天
0
0
Linux之ssh服务默认端口修改

导读 SSH是标准的网络协议,可用于大多数UNIX操作系统,能够实现字符界面的远程登录管理,它默认使用22号端口,采用密文的形式在网络中传输数据,相对于通过明文传输的Telnet,具有更高的安全...

问题终结者
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部