文档章节

[原创]irrlicht 3d游戏武器粒子特效的实现2

styleman
 styleman
发布于 2017/08/13 11:52
字数 663
阅读 8
收藏 0
点赞 0
评论 0

上次讲解了3d游戏里武器的粒子效果实现,今天继续讲解武器表面增强(加)一层纹理特效。

先来看下效果

 

原来武器表面是没有这个七彩图片流动的效果的。

 

原武器的图片

 

这个技术用到了hlsl ,高阶着色器语言(High Level Shader Language,简称HLSL

irrlicht的 10.Shaders  就是hlsl的使用例子。

hlsl又分多种语言,cg hlsl glsl ,我主要使用hlsl的。DIRECT3D9

 

原理我就不细讲了,直接扔代码实现,基于irrlicht dx9

 

加载完武器模型后

IAnimatedMeshSceneNode*     weaponNode;                //武器节点

weaponNode->setMaterialTexture(1,Driver->getTexture("colorful.tga"));//设置武器纹理 

colorful.tga 是个七彩的图片

 

//
	s32 getMaterialType(bool istransparent){
	
		device->getVideoDriver();
		c8* vsFileName = 0; // filename for the vertex shader
		c8* psFileName = 0; // filename for the pixel shader

		video::E_DRIVER_TYPE driverType ;
		driverType=drv->getDriverType();

		switch(driverType)
		{
		case video::EDT_DIRECT3D9:
			psFileName = "weapon.hlsl";
			vsFileName = psFileName; // both shaders are in the same file
			break;
		default:
			return NULL;
			break;
		}

		//检查硬件是否支持着色
		if (!drv->queryFeature(video::EVDF_PIXEL_SHADER_2_0) &&
			!drv->queryFeature(video::EVDF_ARB_FRAGMENT_PROGRAM_1))
		{
			device->getLogger()->log("WARNING: Pixel shaders disabled "\
				"because of missing driver/hardware support.");
			psFileName = 0;
		}

		if (!drv->queryFeature(video::EVDF_VERTEX_SHADER_1_1) &&
			!drv->queryFeature(video::EVDF_ARB_VERTEX_PROGRAM_1))
		{
			device->getLogger()->log("WARNING: Vertex shaders disabled "\
				"because of missing driver/hardware support.");
			vsFileName = 0;
		}

		// create materials

		video::IGPUProgrammingServices* gpu = drv->getGPUProgrammingServices();
		if (gpu)
		{
			
			if(istransparent)
			{
				newMaterialType1 = gpu->addHighLevelShaderMaterialFromFiles(
					getWeaponHLSLFile(device->getFileSystem()), "vs_main", video::EVST_VS_1_1,
					getWeaponHLSLFile(device->getFileSystem()), "ps_main", video::EPST_PS_2_0,
					this, video::EMT_TRANSPARENT_ADD_COLOR   );  //EMT_SOLID EMT_TRANSPARENT_ADD_COLOR
			}else
			{
				newMaterialType1 = gpu->addHighLevelShaderMaterialFromFiles(
					getWeaponHLSLFile(device->getFileSystem()), "vs_main", video::EVST_VS_1_1,
					getWeaponHLSLFile(device->getFileSystem()), "ps_main", video::EPST_PS_2_0,
					this, video::EMT_SOLID   );  //EMT_SOLID EMT_TRANSPARENT_ADD_COLOR
			}
			

			this->drop();
		}

		return newMaterialType1;
	}

 

getMaterialType函数就是个创建gpu 添加hlsl高级着色语言脚本 weapon.hlsl

addHighLevelShaderMaterialFromFiles方法有个参数需要 video::IShaderConstantSetCallBack的接口实现。写个类继承下 : public video::IShaderConstantSetCallBack 并实现OnSetConstants方法(例子可以看irrlicht的 10.Shaders )。

 

	virtual void OnSetConstants(video::IMaterialRendererServices* services, s32 userData)
	{
		IVideoDriver* drv=device->getVideoDriver();


		core::matrix4 mWorldViewProj;
		mWorldViewProj = drv->getTransform(video::ETS_PROJECTION);			
		mWorldViewProj *= drv->getTransform(video::ETS_VIEW);
		mWorldViewProj *= drv->getTransform(video::ETS_WORLD);
		services->setVertexShaderConstant("mWorldViewProj", mWorldViewProj.pointer(), 16);



		float b=1.0;
	    services->setPixelShaderConstant("bright", &b, 1);
	    
		services->setPixelShaderConstant("fTime", &time, 1);
		time+=0.001f;

	}

 

   //给武器加上材质
   weaponNode->setMaterialType(getMaterialType(0));

 

 

weapon.hlsl脚本里代码如下

float4x4 mWorldViewProj;





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;

   Output.Position = mul( Input.Position, mWorldViewProj );

   Output.Texcoord = Input.Texcoord;
 

   return( Output );
   
}




sampler2D baseMap;
sampler2D flameMap;


float fTime;
float bright;

struct PS_INPUT 
{
   float2 Texcoord : TEXCOORD0;

};

struct PS_OUTPUT 
{
 vector color : COLOR0;
};


PS_OUTPUT ps_main( PS_INPUT Input ) 
{
   PS_OUTPUT output;
    output.color=float4(0,0,0,0);

  PS_OUTPUT blue;
    blue.color=float4(0,0,220,0);

   float4 base=tex2D( baseMap, Input.Texcoord );


 
   Input.Texcoord.y = Input.Texcoord.y-fTime; 
   Input.Texcoord.x = Input.Texcoord.x-fTime; 
   float4 color2=tex2D( flameMap,Input.Texcoord  );


   output.color=base + color2;

   if(output.color.x<150 && output.color.y<150 && output.color.z<150){
   	  
	 
	

   }else{
     
		
   }
  output.color*=0.70;
  output.color*=bright;
   return output;
}

 

里面的代码就是对colorful.tga 纹理+武器base纹理。顺便增加了流动效果和亮度微调。

 

如果一切正确,那么运行结果就是武器有了纹理流动的特效了。

 

 

3d游戏武器粒子特效的实现2 完。

 

© 著作权归作者所有

共有 人打赏支持
styleman

styleman

粉丝 6
博文 19
码字总数 18282
作品 5
武汉
程序员
3drpgdemo

3drpgdemo 是采用 irrlicht 3d render engine 渲染图像的一个 3d rpg demo。 使用了一些常用的技术,比如模型,地图,武器,切换加载,动画特效,粒子,水面等等。 可以给新手提供代码研究学...

styleman ⋅ 2015/06/16 ⋅ 1

3D游戏引擎--Irrlicht

Irrlicht是一个3D游戏引擎。它具有高效,实时等特点,是个完全跨平台的引擎,使用D3D、OpenGL和它的自己的渲染程序。支持动态的阴影,粒子系统,角色动画,室内和室外技术以及碰撞检测等。 更多...

匿名 ⋅ 2008/12/06 ⋅ 0

3D引擎--可移植到Android的开源的引擎及调查报告

随着android在全球的风靡,越来越多的人将自己的目光投向搭载android的移动设备,但由于手持设备的局限性,怎样利用有限的资源来达到很好的体验,是设备厂商必须要考虑的问题,其中炫目的界面...

我希冀着 ⋅ 2011/11/28 ⋅ 2

3D引擎--可移植到Android的开源的引擎

随着android在全球的风靡,越来越多的人将自己的目光投向搭载android的移动设备,但由于手持设备的局限性,怎样利用有限的资源来达到很好的体验,是设备厂商必须要考虑的问题,其中炫目的界面...

长平狐 ⋅ 2012/08/29 ⋅ 6

Unity3D 插件分享

200个插件免费分享约5G。 【清单如下】 2DToolkit1.51 动画开发插件包 FingerGestures 触摸插件 ORKOkashiRPG_Kit Unity3D角色扮演游戏开发工具包 uScript-Visual-Scripting-Tool-for-UnityE...

郑华勇 ⋅ 2012/12/14 ⋅ 1

Silverlight游戏研发手记:(五)SLG动感增效之《幻影粒子》

随着电子技术发展与普及,人们使用电脑时间越来越长,由于人类自身身体比如眩晕症、眼球衰老等客观因素存在,未来玩家会更加倾向于低视疲劳度/低神经刺激的绿色健康休闲2D游戏而非3D。《希魔...

晨曦之光 ⋅ 2012/03/09 ⋅ 0

购买李宁Cocos2d-x套餐,送最新出的《Cocos2d-x游戏实战指南》签名书一本

活动时间:2016-10-18至2016-11-30 通过本套餐,可完全了解Cocos2d-x 3.x的相关技术,以及掌握C++语言,并具有一定的项目实战经验。 Cocos2d-x游戏开发套餐:http://edu.51cto.com/pack/vie...

androidguy ⋅ 2016/10/17 ⋅ 0

典型开源3D引擎分类比较

常见的3D引擎有:Unreal、Quake、Lithtech、OGRE、Nebula、Irrlicht、Truevision3D... 其中开源免费的有:OGRE、irrlicht、fly3d、NeoEngine、revolution3d、 Nebula2、Genesis3d等。 OGRE 在...

长平狐 ⋅ 2013/01/06 ⋅ 0

Genesis-3D新手入门——10.粒子系统

粒子系统 粒子系统是Genesis-3D编辑器里一个重要的功能,在一个游戏里,优秀的粒子使用手法可以极大地增加游戏的视觉效果,直接为你设计的游戏加分。因此,要想让你的游戏变得华丽,有接近顶...

lengche ⋅ 2014/02/20 ⋅ 0

FPS 游戏 3D 引擎--BananaBread

BananaBread 是运行于 Web 的第一人称射击游戏的 Cube 2/Sauerbrate 3D 引擎端口,它通过用 Emscripten 来对 C++、OpenGL 和 WebGL 进行编译。它具有以下特点: 多视觉效果,包括水反射/折射...

孔小菜 ⋅ 2015/08/03 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Cube、Cuboid 和 Cube Segment

1.Cube (或Data Cube),即数据立方体,是一种常用于数据分析与索引的技术;它可以对原始数据建立多维度索引。通过 Cube 对数据进行分析,可以大大加快数据的查询效率 2.Cuboid 在 Kylin 中特...

无精疯 ⋅ 33分钟前 ⋅ 0

github太慢

1:用浏览器访问 IPAddress.com or http://tool.chinaz.com 使用 IP Lookup 工具获得github.com和github.global.ssl.fastly.net域名的ip地址 2:/etc/hosts文件中添加如下格式(IP最好自己查一...

whoisliang ⋅ 35分钟前 ⋅ 0

非阻塞同步之 CAS

为解决线程安全问题,互斥同步相当于以时间换空间。多线程情况下,只有一个线程可以访问同步代码。这种同步也叫阻塞同步(Blocking Synchronization). 这种同步属于一种悲观并发策略。认为只...

长安一梦 ⋅ 45分钟前 ⋅ 0

云计算的选择悖论如何对待?

人们都希望在工作和生活中有所选择。但心理学家的调查研究表明,在多种选项中进行选择并不一定会使人们更快乐,甚至不会产生更好的决策。心理学家Barry Schwartz称之为“选择悖论”。云计算为...

linux-tao ⋅ 48分钟前 ⋅ 0

我的第一篇个人博客

虽然这是个技术博客,但是,我总是想写一些自己的东西,所有就大胆的在这里写下了第一篇非技术博客。技术博客也很久没有更新,个人原因。 以后自己打算在这里写一些非技术博客,可能个人观点...

Mrs_CoCo ⋅ 49分钟前 ⋅ 0

Redis 注册为 Windows 服务

Redis 注册为 Windows 服务 redis 注册为 windows 服务相关命令 注册服务 redis-server.exe –service-install redis.windows.conf 删除服务 redis-server –service-uninstall 启动服务 re......

Os_yxguang ⋅ 49分钟前 ⋅ 0

世界那么大,语言那么多,为什么选择Micropython,它的优势在哪?

最近国内MicroPython风靡程序界,是什么原因导致它这么火呢?是因为他功能强大,遵循Mit协议开源么? 错!因为使用它真的是太舒服了!!! Micropython的由来,这得益于Damien George这位伟大...

bodasisiter ⋅ 52分钟前 ⋅ 0

docker 清理总结

杀死所有正在运行的容器 docker kill $(docker ps -a -q) 删除所有已经停止的容器(docker rm没有加-f参数,运行中的容器不会删掉) docker rm $(docker ps -a -q) 删除所有未打 dangling 标...

vvx1024 ⋅ 今天 ⋅ 0

关于学习

以前学车的时候,教练说了这样的一句话:如果一个人坐在车上一直学,一直学,反而不如大家轮流着学。因为一个人一直学,就没有给自己留空间来反思和改进。而轮流着学的时候大家下来之后思考上...

mskk ⋅ 今天 ⋅ 0

压缩工具之gzip-bzip2-xz

win下常见压缩工具:rar zip 7z linux下常见压缩工具:zip gz bz2 xz tar.gz tar.bz2 tar.xz gzip 不支持目录压缩 gzip 1.txt #压缩。执行后1.txt消失,生成1.txt.gz压缩文件 gzip -d 1.txt....

ZHENG-JY ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部