文档章节

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

大賢者
 大賢者
发布于 2017/08/13 11:52
字数 663
阅读 34
收藏 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 完。

 

© 著作权归作者所有

共有 人打赏支持
大賢者

大賢者

粉丝 11
博文 24
码字总数 21153
作品 5
武汉
程序员
私信 提问
3drpgdemo

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

styleman
2015/06/16
437
1
3D游戏引擎--Irrlicht

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

匿名
2008/12/06
40.7K
0
盈趣上海众多游戏技术岗位火热招募中

职位一:C/C++客户端开发工程师 工作职责: 1.负责MTK平台游戏客户端主要模块的开发 2.负责游戏客户端与服务器端的交互 3.负责客户端代码的整合及优化 职位要求: 1. 1年以上MTK平台游戏开发...

yuer150
2011/04/26
366
3
盈趣信息技术上海有限公司众多技术岗位招募中

职位一:C/C++客户端开发工程师 工作职责: 1.负责MTK平台游戏客户端主要模块的开发 2.负责游戏客户端与服务器端的交互 3.负责客户端代码的整合及优化 职位要求: 1. 1年以上MTK平台游戏开发经验...

yuer150
2011/05/02
1K
0
3D引擎--可移植到Android的开源的引擎及调查报告

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

我希冀着
2011/11/28
0
2

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 你一口我一口多咬一口是小狗

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @达尔文 :分享Roy Orbison的单曲《She's a Mystery to Me》 《She's a Mystery to Me》- Roy Orbison 手机党少年们想听歌,请使劲儿戳(这里...

小小编辑
30分钟前
10
2
Spring源码学习笔记-1-Resource

打算补下基础,学习下Spring源码,参考书籍是《Spring源码深度解析》,使用版本是Spring 3.2.x,本来想试图用脑图记录的,发现代码部分不好贴,还是作罢,这里只大略记录下想法,不写太细了 ...

zypy333
今天
12
0
RestClientUtil和ConfigRestClientUtil区别说明

RestClientUtil directly executes the DSL defined in the code. ConfigRestClientUtil gets the DSL defined in the configuration file by the DSL name and executes it. RestClientUtil......

bboss
今天
18
0

中国龙-扬科
昨天
2
0
Linux系统设置全局的默认网络代理

更改全局配置文件/etc/profile all_proxy="all_proxy=socks://rahowviahva.ml:80/"ftp_proxy="ftp_proxy=http://rahowviahva.ml:80/"http_proxy="http_proxy=http://rahowviahva.ml:80/"......

临江仙卜算子
昨天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部