文档章节

《Genesis-3D游戏引擎系列教程-高级篇》2:自定制水

Genesis-3D
 Genesis-3D
发布于 2014/01/24 18:57
字数 1053
阅读 136
收藏 1

注:本系列进阶教程仅针对引擎编辑器:v1.2.2及以下版本

自定制水

素材资源    工程文件

这是一个自定制水的实例,本实例通过定制shader和脚本,展现出一个自定义的水面,帮助用户熟悉在Genesis-3D中定制水效的流程,并且了解shader的编写与使用和在脚本中使用RenderTexture,设置shader参数等渲染相关的技巧。

1. 创建一个面片,把工程资源中提供的waterplane拖入场景:

2. 创建一个材质文件,将其命名为water:

3. 创建一个文本文件命名为FX_Water.shader

在shader里用户可以自定义水面效果,在本实例中实现的大致思路如下,以供参考,完整代码请参阅工程资源内的FX_Water.shader。

01 //在顶点渲染器中控制顶点的移动
02 float3 offsets = GerstnerOffset4(worldpos.xz, Steepness, Amplitude,Frequency, Speed,    DirectionAB, DirectionCD);
03 float3 nrml = GerstnerNormal4(worldpos.xz + offsets.xz, Amplitude,Frequency, Speed, DirectionAB, DirectionCD);
04  
05 //计算UV
06 float4 projTex = p.input_ClipSpacePos;
07 projTex.xy /= projTex.w;
08 projTex.x   = 0.5 * projTex.x + 0.5;
09 projTex.y   = -0.5 * projTex.y + 0.5;
10 projTex.xy += g_ScreenSize.zw;
11  
12 float4 reflectCoord = p.input_ClipSpacePos;
13 reflectCoord.xy /= reflectCoord.w;
14 reflectCoord.x *= -1.0f;
15 reflectCoord.x   = 0.5 * reflectCoord.x + 0.5;
16 reflectCoord.y   = -0.5 * reflectCoord.y + 0.5;
17 reflectCoord.xy += g_ScreenSize.zw;
18  
19    //采样反射与折射
20 float4  reflectCol = tex2D(_reflectionMap, reflectCoord.xy+perturbVec);
21 loat4  refractCol = tex2D(_refractionMap, projTex.xy-perturbVec);
22  
23    //混合像素颜色
24 refractCol  *= 1 + depth.y * CausticPower;
25 refractCol   = lerp(WaterColor, refractCol, depth.x);
26 float refractWt = saturate(RefractBias + pow(max(dot(viewdir, normalW), 0.0f), RefractPower));
27 float4 lerp_color = lerp(reflectCol, refractCol, refractWt);
28  
29 float4 spec    = t * WaterSpecColor;
30 float4 diffuse = (lerp_color * g_LightDiffuse[0] * WaterDiffuseColor);
31 o.Diffuse = diffuse + spec;

4. 设置waterplane的材质为water,设置water的shader为FX_Water.shader:

5. 创建一个脚本文件,命名为WaterRender.cs

在脚本文件中用户可以自由创建相机,绘制RT,设置shader参数用以完善效果,制作更加真实高级的水面效果 在本实例中实现的大致思路如下,以供参考,完整代码请参阅工程资源内的WaterRender.cs

01 //设定反射矩阵
02 private Matrix44 Reflect(Vector4 plane)
03         {
04             Matrix44 matout = new Matrix44();
05             matout[0, 0] = -2.0f * plane.X * plane.X + 1.0f;
06             matout[0, 1] = -2.0f * plane.X * plane.Y;
07             matout[0, 2] = -2.0f * plane.X * plane.Z;
08             matout[0, 3] = -2.0f * plane.X * plane.W;
09  
10             matout[1, 0] = -2.0f * plane.Y * plane.X;
11             matout[1, 1] = -2.0f * plane.Y * plane.Y + 1.0f;
12             matout[1, 2] = -2.0f * plane.Y * plane.Z;
13             matout[1, 3] = -2.0f * plane.Y * plane.W;
14  
15             matout[2, 0] = -2.0f * plane.Z * plane.X;
16             matout[2, 1] = -2.0f * plane.Z * plane.Y;
17             matout[2, 2] = -2.0f * plane.Z * plane.Z + 1.0f;
18             matout[2, 3] = -2.0f * plane.Z * plane.W;
19             matout[3, 0] = 0.0f; matout[3, 1] = 0.0f; matout[3, 2] = 0.0f; matout[3, 3] = 1.0f;
20             return matout;
21         }
22  
23  
24 //创建折射相机与RT
25 private void CreateReflect()
26         {
27             int width = GraphicSystem.GetWidth();
28             int height = GraphicSystem.GetHeight();
29             Vector4 color = new Vector4(0.25f,0.25f,0.25f,1.0f);
30  
31  
32             reflectRtt = new RenderToTexture();
33             reflectRtt.Setup(width / 2, height / 2, PixelFormat.X8R8G8B8, ClearFlag.ClearAll, refcolor, true);
34  
35  
36  
37             reflectCam = new Camera();
38             reflectCam.SetupPerspectiveFovRH(0.75f, width / height, 1.0f, 10000.0f);
39             reflectCam.SetRenderTarget(reflectRtt);
40             reflectCam.SetLightLitTexture(lightlit);
41             reflectCam.RenderDepth = false;
42             reflectCam.RenderNormal = true;
43             reflectCam.RenderCustomised = true;
44             reflectCam.CullMask = RenderLayer.eRLDefault;
45             reflectCam.UseBeforeDrawEvent = false;
46             reflectCam.RenderShadowMap = false;
47         }
48  
49 private void CreateRefract()
50         {
51             int width = GraphicSystem.GetWidth();
52             int height = GraphicSystem.GetHeight();
53             Vector4 color = new Vector4(0.25f,0.25f,0.25f,1.0f);
54             refractRtt = new RenderToTexture();
55             refractRtt.Setup(width / 2, height / 2, PixelFormat.A16B16G16R16F, ClearFlag.ClearAll, ref color, true);
56  
57             refractCam = new Camera();
58             refractCam.SetupPerspectiveFovRH(0.75f, width / height, 1.0f, 10000.0f);
59             refractCam.SetRenderTarget(refractRtt);
60             refractCam.SetLightLitTexture(lightlit);
61             refractCam.RenderDepth = false;
62             refractCam.RenderNormal = true;
63             refractCam.RenderCustomised = true;
64             refractCam.CullMask = RenderLayer.eRLDefault;
65             refractCam.UseBeforeDrawEvent = false;
66             refractCam.RenderShadowMap = false;
67         }
68  
69  
70  
71 //设置其他材质参数
72 meshRenderCom.SetTexture(0, "_waveMap", "asset:Media/Waterbump.dds", 0);
73             meshRenderCom.SetTexture(0, "_fresnelMap", "asset:Media/WaterFresnel.dds", 0);
74             meshRenderCom.SetTexture(0, "_reflectionMap", reflectRtt);
75             meshRenderCom.SetTexture(0, "_refractionMap", refractRtt);
76  
77 //渲染反射与折射相机
78 public override void OnWillRenderObject(RenderComponent sender)
79         {
80             Owner.LayerID = 4;
81             if (reflectCam == null)
82             {
83                 lightlit = new RenderToTexture();
84                 Vector4 lightlitColor = Vector4.One;
85                 lightlit.Setup(1, 1, PixelFormat.X8R8G8B8, ClearFlag.ClearAll, ref lightlitColor,false);
86  
87                 CreateReflect();
88                 CreateRefract();
89                 SetupMat();
90             }
91    
92             UpdateRefract();
93             UpdateReflect();
94             //---------------------uv offest-----------------------//
95             UpdataMat();
96  
97             GraphicSystem.RenderCamera(reflectCam);
98             GraphicSystem.RenderCamera(refractCam);
99         }

6. 将脚本挂接在waterplane上:

7. 导入实例资源内提供的wave0.dds、wave1.dds、Waterbump.dds、WaterFresnel.dds 将wave1和wave2设置给材质中的_waveMap1和_waveMap2两个参数,两外张图是脚本中设置的材质资源。

8. 调整shader反射的参数,定制出属于自己的水面效果:



引擎官方网站:http://www.genesis-3d.com.cn/

官方论坛:http://bbs.9tech.cn/genesis-3d/

官方千人大群:59113309   135439306

YY频道-游戏开发大讲堂(完全免费,定期开课):51735288 

Genesis-3D开源游戏引擎:游戏起源,皆因有我!!!



© 著作权归作者所有

Genesis-3D
粉丝 12
博文 34
码字总数 33360
作品 0
佛山
私信 提问
《Genesis-3D游戏引擎系列教程-入门篇》一:安装与创建工程

注:本系列入门教程仅针对引擎编辑器:v1.2.2及以下版本 1、安装编辑器 要使用Genesis-3D来制作游戏的第一步就是将Genesis-3D安装到您的计算机上。安装编辑器是一个很简单的过程,你可以简单...

Genesis-3D
2014/01/16
114
0
《Genesis-3D游戏引擎系列教程-进阶篇》5:场景-水

注:本系列进阶教程仅针对引擎编辑器:v1.2.2及以下版本 场景水 资源下载 工程文件 这是一个简单的场景水实例,制作了一个具有反射和折射效果的场景水,帮助用户学习如何在Genesis-3D编辑器中...

Genesis-3D
2014/01/21
74
0
《Genesis-3D游戏引擎系列教程-进阶篇》2:声音

注:本系列进阶教程仅针对引擎编辑器:v1.2.2及以下版本 声音 众所周知,声音系统是一个游戏中非常重要的组成部分,优秀的游戏音乐是许多玩家能够长时间享受其中的重要因素。因此,熟悉和使用...

Genesis-3D
2014/01/20
60
0
《Genesis-3D游戏引擎系列教程-入门篇》二:运行发布游戏

注:本系列入门教程仅针对引擎编辑器:v1.2.2及以下版本 游戏的发布与运行 本章工程下载 当我们使用Genesis-3D编辑器开发游戏的时候,经常想了解现阶段做的游戏是否能够达到我们心中的标准,...

Genesis-3D
2014/01/16
310
0
《Genesis-3D游戏引擎系列教程-进阶篇》3:转动的球体

注:本系列进阶教程仅针对引擎编辑器:v1.2.2及以下版本 转动的球体 资源下载 工程文件 当我们掌握了一些Genesis-3D编辑器的操作技巧之后,现在来尝试着做一个非常简单的游戏,一个转动的球体...

Genesis-3D
2014/01/20
275
0

没有更多内容

加载失败,请刷新页面

加载更多

java通过ServerSocket与Socket实现通信

首先说一下ServerSocket与Socket. 1.ServerSocket ServerSocket是用来监听客户端Socket连接的类,如果没有连接会一直处于等待状态. ServetSocket有三个构造方法: (1) ServerSocket(int port);...

Blueeeeeee
43分钟前
4
0
用 Sphinx 搭建博客时,如何自定义插件?

之前有不少同学看过我的个人博客(http://python-online.cn),也根据我写的教程完成了自己个人站点的搭建。 点此:使用 Python 30分钟 教你快速搭建一个博客 为防有的同学不清楚 Sphinx ,这...

王炳明
昨天
4
0
黑客之道-40本书籍助你快速入门黑客技术免费下载

场景 黑客是一个中文词语,皆源自英文hacker,随着灰鸽子的出现,灰鸽子成为了很多假借黑客名义控制他人电脑的黑客技术,于是出现了“骇客”与"黑客"分家。2012年电影频道节目中心出品的电影...

badaoliumang
昨天
13
0
很遗憾,没有一篇文章能讲清楚线程的生命周期!

(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本。 简介 大家都知道线程是有生命周期,但是彤哥可以认真负责地告诉你网上几乎没有一篇文章讲得是完全正确的。 ...

彤哥读源码
昨天
14
0
jquery--DOM操作基础

本文转载于:专业的前端网站➭jquery--DOM操作基础 元素的访问 元素属性操作 获取:attr(name);$("#my").attr("src"); 设置:attr(name,value);$("#myImg").attr("src","images/1.jpg"); ......

前端老手
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部