热门标签 | 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
			}
		}
	}
}



推荐阅读
  • 张正友相机标定算法解析:无需棋盘格
    本文深入探讨了张正友教授于1998年提出的单平面标定技术,该方法结合了传统标定与自标定的优势,通过简易的棋盘格实现了高效准确的相机标定。 ... [详细]
  • 本文总结了一次针对大厂Java研发岗位的面试经历,探讨了面试中常见的问题及其背后的原因,并分享了一些实用的面试准备资料。 ... [详细]
  • 小编给大家分享一下Vue3中如何提高开发效率,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获, ... [详细]
  • 深入解析层次聚类算法
    本文详细介绍了层次聚类算法的基本原理,包括其通过构建层次结构来分类样本的特点,以及自底向上(凝聚)和自顶向下(分裂)两种主要的聚类策略。文章还探讨了不同距离度量方法对聚类效果的影响,并提供了具体的参数设置指导。 ... [详细]
  • 探索百度WebFE团队打造的强大HTML5上传插件Web Uploader
    本文将详细介绍由百度WebFE团队开发的Web Uploader,这是一款集成了HTML5与Flash技术的上传组件,以其卓越的用户体验和强大的功能著称。 ... [详细]
  • HTML:  将文件拖拽到此区域 ... [详细]
  • 提升移动应用用户体验的8个设计策略
    随着移动应用成为数字世界连接的关键桥梁,用户体验(UX)设计的重要性日益凸显。本文将探讨为何优质的UX设计对移动应用的成功至关重要,并分享8个实用的设计技巧,帮助开发者优化用户体验。 ... [详细]
  • Bootstrap 的轮播图(Carousel)组件提供了一种简单而灵活的方法,用于在网站上实现响应式幻灯片效果。此组件不仅支持图片展示,还兼容嵌入式框架、视频等多媒体内容。 ... [详细]
  • 计算机学报精选论文概览(2020-2022)
    本文汇总了2020年至2022年间《计算机学报》上发表的若干重要论文,旨在为即将投稿的研究者提供参考。 ... [详细]
  • 本文详细介绍了如何在Android L版本中应用Material Design的主题和布局,包括Material主题的应用方法、自定义主题和颜色方案、状态栏和导航条的自定义,以及Material Design布局的特点和兼容性处理。 ... [详细]
  •  IntelliJ IDEA 必备插件与快捷键指南
    本文介绍了多个提升 IntelliJ IDEA 使用体验的插件以及十个高效的快捷键,旨在帮助开发者提高编码效率。 ... [详细]
  • 本文介绍了一种基于 MATLAB 的显著性检测评估指标 Normalized Scanpath Saliency (NSS) 的实现方法。通过计算显著图与注视点图之间的 NSS 分数,可以有效评估显著性模型的性能。 ... [详细]
  • 中国地质大学(北京)宿舍条件与环境解析
    中国地质大学(北京)作为一所知名高校,其宿舍条件如何?本文将通过多角度分析,结合实际图片,为即将入学的学生提供详尽的宿舍环境介绍。 ... [详细]
  • 本文将深入探讨 Unreal Engine 4 (UE4) 中的距离场技术,包括其原理、实现细节以及在渲染中的应用。距离场技术在现代游戏引擎中用于提高光照和阴影的效果,尤其是在处理复杂几何形状时。文章将结合具体代码示例,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 高效的JavaScript异步资源加载解决方案
    本文探讨了如何通过异步加载技术处理网页中大型第三方插件的加载问题,避免将大文件打包进主JS文件中导致的加载时间过长,介绍了实现异步加载的具体方法及其优化。 ... [详细]
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社区 版权所有