热门标签 | HotTags
当前位置:  开发笔记 > 程序员 > 正文

用Ogre做一个效率高又漂亮的水面

以前游戏水面的做法都是用很多张图的序列帧实现的纹理动画,这种固定渲染管线的方式,在最低画质的时候采用特别好,但是对于更高级别的画质,就应该采用更好效果的水面。水面渲染,Ogre有个插

以前游戏水面的做法都是用很多张图的序列帧实现的纹理动画,这种固定渲染管线的方式,在最低画质的时候采用特别好,但是对于更高级别的画质,就应该采用更好效果的水面。


水面渲染,Ogre有个插件叫Hydrax,效果很不错,但是效率也低的很,没任何实用价值。只好自己做一个。

一个漂亮3D游戏水面的,一般有水波模拟,bump mapping,倒影,折射,菲捏尔效果,水下效果等,我准备做一些取舍,实现高效率。

1)只保留倒影,去掉折射,菲捏尔效果,水下效果,因为2.5D游戏,视角比较固定,也不需要深入到水下。

2)优化倒影的RTT渲染,手动选择哪些物体需要产生倒影,这样就极大减少渲染批次。

3)bump mapping采用法线贴图方式,计算水面光照。

4)水波模拟适合大海,要和不要关系不大,不同位置的多次采样保证了水纹的流动

5)用浮点处理水深,提高精度,水深过渡自然。



效果比较满意,水深过渡自然,海水颜色,流动方向,纹理大小等可以动态调节,而且效率上很高,只增加了一个倒影的RTT开销,也不需要美术提供海水图片,shader计算也不复杂。


material FresnelReflectionRefraction
{
	// 一个pass
	technique 
	{
		pass 
		{
			diffuse 0.5 0.5 0.5
			specular 1 1 1 512
			
			scene_blend alpha_blend
			depth_write off  
			
			vertex_program_ref FresnelRefractReflectVP
			{
				param_named_auto worldViewProjMatrix worldviewproj_matrix
				param_named_auto eyePosition camera_position_object_space
				param_named_auto lightPosition1 light_position_object_space 1 
				
				param_named BumpScale float 0.35
				param_named textureScale float2 1 1
				param_named bumpSpeed float2 -0.025 0.025
				param_named_auto time time_0_x 100.0
				param_named waveFreq float 0.028
				param_named waveAmp float 1.8
				
			}
			fragment_program_ref FresnelRefractReflectFP
			{
				param_named_auto ambient ambient_light_colour
				param_named_auto diffuseParameters surface_diffuse_colour
				param_named_auto specularParameters surface_specular_colour
				param_named waterColor float4 0 0.6 0.7 1.0
			}
			// Noise
			texture_unit
			{
				// Perlin noise volume
				texture waves.dds
				// min / mag filtering, no mip
				filtering linear linear none
			}
			// Reflection
			texture_unit Reflection
			{
				// Will be filled in at runtime
				texture Reflection
				tex_address_mode clamp
			}
		}
	}
	
	// 2 个 pass, 高光单独计算不受水深影响, 但高光没法被雾遮挡
	technique
	{
		pass 
		{
			scene_blend alpha_blend
			depth_check on
			depth_write off  
			
			vertex_program_ref FresnelRefractReflectVP
			{
				param_named_auto worldViewProjMatrix worldviewproj_matrix
				param_named_auto eyePosition camera_position_object_space
				param_named_auto lightPosition1 light_position_object_space 1 
				
				param_named BumpScale float 0.2
				param_named textureScale float2 1 1
				param_named bumpSpeed float2 -0.04 0.04
				param_named_auto time time_0_x 100.0
				param_named waveFreq float 0.028
				param_named waveAmp float 1.8
				
			}
			fragment_program_ref FresnelRefractReflectFP_NoSpecular
			{
				param_named_auto ambient ambient_light_colour
				param_named deepColor float4 0 0.3 0.5 1.0
				param_named shallowColor float4 0 1 1 1.0
				param_named reflectionAmount float 1.0
				param_named waterAmount float 0.2
			}
			// Noise
			texture_unit
			{
				// Perlin noise volume
				texture waves.dds
				// min / mag filtering, no mip
				filtering linear linear none
			}
			// Reflection
			texture_unit Reflection
			{
				// Will be filled in at runtime
				texture Reflection
				tex_address_mode clamp
			}
		}
		
		// 高光单独计算,不受水深影响
		pass 
		{
			specular 1 1 1 512
			
			scene_blend add
			depth_write off  
			
			fog_override true
			
			vertex_program_ref FresnelRefractReflectVP
			{
				param_named_auto worldViewProjMatrix worldviewproj_matrix
				param_named_auto eyePosition camera_position_object_space
				param_named_auto lightPosition1 light_position_object_space 1 
				
				param_named BumpScale float 0.2
				param_named textureScale float2 1 1
				param_named bumpSpeed float2 -0.04 0.04
				param_named_auto time time_0_x 100.0
				param_named waveFreq float 0.028
				param_named waveAmp float 1.8
				
			}
			fragment_program_ref FresnelRefractReflectFP_Specular
			{
				param_named_auto specularParameters surface_specular_colour
			}
			// Noise
			texture_unit
			{
				// Perlin noise volume
				texture waves.dds
				// min / mag filtering, no mip
				filtering linear linear none
			}
		}
	}
	
	// 固定管线
	technique
	{
		pass
		{
			ambient 0.588235 0.588235 0.588235 1
			diffuse 0.588235 0.588235 0.588235 1
			specular 0.9 0.9 0.9 20
			scene_blend alpha_blend
			depth_check on
			depth_write off        
			texture_unit
			{
				anim_texture jpg_海湖水.dds 28 2				
			}
			texture_unit
			{
				texture water_depth.tga 1d
				colour_op_ex source1 src_current src_texture
				colour_op_multipass_fallback one zero
				alpha_op_ex modulate src_current src_texture
				tex_coord_set 1
				tex_address_mode clamp
				filtering none none none
			}
		}
	}
}



推荐阅读
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • 生成对抗式网络GAN及其衍生CGAN、DCGAN、WGAN、LSGAN、BEGAN介绍
    一、GAN原理介绍学习GAN的第一篇论文当然由是IanGoodfellow于2014年发表的GenerativeAdversarialNetworks(论文下载链接arxiv:[h ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 家装日记六:家具采购和瓷砖选择
    本文记录了作者进行家装的过程,包括家具采购和瓷砖选择。作者介绍了自己家的装修风格以及选择烤漆家具和红白系列的原因。作者还提到了装修风格以简约为主,不可以太花哨的要求。最后,作者提到了价格较贵的问题。 ... [详细]
  • 本文讨论了当某位排位靠前的涉众提供了一张精美的界面图片时,是否可以将其作为设计约束。同时还探讨了高质量素材和愿景之间的关系,以及老大自身的软件方法和建模技能。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文介绍了一些好用的搜索引擎的替代品,包括网盘搜索工具、百度网盘搜索引擎等。同时还介绍了一些笑话大全、GIF笑话图片、动态图等资源的搜索引擎。此外,还推荐了一些迅雷快传搜索和360云盘资源搜索的网盘搜索引擎。 ... [详细]
  • 【MicroServices】【Arduino】装修甲醛检测,ArduinoDart甲醛、PM2.5、温湿度、光照传感器等,数据记录于SD卡,Python数据显示,UI5前台,微服务后台……
    这篇文章介绍了一个基于Arduino的装修甲醛检测项目,使用了ArduinoDart甲醛、PM2.5、温湿度、光照传感器等硬件,并将数据记录于SD卡,使用Python进行数据显示,使用UI5进行前台设计,使用微服务进行后台开发。该项目还在不断更新中,有兴趣的可以关注作者的博客和GitHub。 ... [详细]
  • 本文研究了使用条件对抗网络进行图片到图片翻译的方法,并提出了一种通用的解决方案。通过学习输入图像到输出图像的映射和训练相应的损失函数,我们可以解决需要不同损失函数公式的问题。实验证明该方法在合成图片、重构目标和给图片着色等多个问题上都很有效。这项工作的重要发现是不再需要人为构建映射函数和损失函数,同时能够得出合理的结果。本文的研究对于图片处理、计算机图片合成和计算机视觉等领域具有重要意义。 ... [详细]
  • 本文介绍了在Vue项目中如何结合Element UI解决连续上传多张图片及图片编辑的问题。作者强调了在编码前要明确需求和所需要的结果,并详细描述了自己的代码实现过程。 ... [详细]
  • 也就是|小窗_卷积的特征提取与参数计算
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了卷积的特征提取与参数计算相关的知识,希望对你有一定的参考价值。Dense和Conv2D根本区别在于,Den ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 计算成像的原理与应用研究
    本文探讨了计算成像的原理与应用研究。首先介绍了小孔成像实验和软件方面的相关内容。随后从傅里叶光学的角度简单谈了成像的过程。成像是观测样品分布的一种方法,通过成像系统接收光的强度来呈现图像。视网膜作为接收端接收到的图像实际上是由像元组成的矩阵,每个元素代表相应位置像元接收光的强度。大脑通过对图像的分析,得出一系列信息,如识别物体、判断距离等。计算成像是一种采集记录系统,通过处理数据得到样品分布与像的对应关系,用于后续问题的分析。 ... [详细]
author-avatar
手机用户2602885631_316
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有