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

原创 2017年08月16日 16:47:13

上次讲解了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 完。

 

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

[原创]irrlicht 3d游戏武器粒子特效的实现 3d游戏里的武器特效比如有粒子发光,火焰,或者是剑气散发出来。一般都可以用粒子来实现...
  • smwhotjay
  • smwhotjay
  • 2017年07月27日 13:44
  • 289

基于Irrlicht引擎的3D游戏实例V0.1

最近研究Irrlicht引擎,做了个demon,包含如下功能: 1
  • xianyuxiaoqiang
  • xianyuxiaoqiang
  • 2014年07月22日 18:09
  • 540

3D游戏引擎剖析

原文作者:Jake Simpson 译者: 向海 Email:GameWorldChina@myway.com  第1部分: 游戏引擎介绍, 渲染和构造3D世界 介绍   自Doom游戏时代以来我们已...
  • yiyong0418
  • yiyong0418
  • 2006年09月16日 16:35
  • 2830

Irrlicht例程03:载入3D角色模型

首先你得准备一个3D模型,xia'mian's
  • von_Ryan_Hack
  • von_Ryan_Hack
  • 2014年07月30日 14:53
  • 1056

四大开源3d游戏引擎探究----irrlicht与orge对比

四大开源3d游戏引擎探究 水平有限,只对于长久以来研究的几个经典3d游戏引擎的设计思想、程序架构和应用行深入剖析的结果与游戏开发同行分享,文档有不妥之处请指出,期待我们的共同进步。 引擎名称: ...
  • cbbbc
  • cbbbc
  • 2015年08月19日 20:27
  • 2787

基于C# 和Irrlicht的3D漫游开发浅谈

                                                  基于Irrlicht1.41的3D漫游开发浅谈          不久前开始研究这个引擎,功能前大就...
  • haishi110
  • haishi110
  • 2008年08月19日 21:00
  • 974

Qt 使用irrlicht(鬼火)3D引擎

项目中需要加载简单的3D场景。资深老前辈推荐使用开源小巧的引擎irrlicht。 关于irrlicht,来之百度百科 Irrlicht引擎是一个用C++书写的高性能实时的3D引擎,可以应用于C++程序...
  • z609932088
  • z609932088
  • 2016年04月27日 18:05
  • 1980

Irrlicht 3D Engine 笔记系列之 教程4 - Movement

详细解析Irrlicht引擎中关于Event Handle,Animator的实现方法,以及对Framerate Independent和Framerate dependent控制方式进行讨论...
  • i_dovelemon
  • i_dovelemon
  • 2014年12月16日 20:10
  • 4515

带武器的格斗游戏,武器带回血

 #include using namespace std; class Weapon { public:     Weapon(string wnam, int f);     ...
  • yaozhiwei110
  • yaozhiwei110
  • 2016年06月08日 19:40
  • 272

开源3D游戏引擎Irrlicht简介

Irrlicht简介Irrlicht在国内也被叫做“鬼火”引擎,是一款用C++编写的开放源代码的高性能游戏引擎。而且是跨平台的,具有很好的移植性,Irrlicht支持OpenGl、Direcx3D渲染...
  • Rongbo_J
  • Rongbo_J
  • 2015年04月10日 13:00
  • 3197
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[原创]irrlicht 3d游戏武器粒子特效的实现2
举报原因:
原因补充:

(最多只允许输入30个字)