[原创]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游戏里的武器特效比如有粒子发光,火焰,或者是剑气散发出来。一般都可以用粒子来实现...

【Cocos2d-x游戏引擎开发笔记(12)】粒子系统实现与用户交互的特效

原创文章,转载请注明出处:http://blog.csdn.net/zhy_cheng/article/details/8294125。 无实战不学习,这次来用粒子系统实现与用户交互的特效。下面是在...

Cocos2d-x游戏引擎开发笔记(12)】粒子系统实现与用户交互的特效

原文地址:【Cocos2d-x游戏引擎开发笔记(12)】粒子系统实现与用户交互的特效作者:九城学院 来源:CSDN    作者:张译成 无实战不学习,这次来用粒子系统实现与用户交互的特...

unity3d 游戏粒子特效

  • 2017年09月19日 18:12
  • 12.39MB
  • 下载

HTML5 2D游戏引擎研发系列 第六章 <Canvas技术篇-画布技术-混色特效和粒子>

前几章节学得怎么样呢?是否你的引擎已经有一个初级的模型了?是否开始枯燥的思考应该如何搭建一个你自己的架构呢?现在本章节就让你放松放松,我们将要学习游戏中最酷,最炫的部分,但是,它却是如此如此的简单,简...

Cocos2D游戏之旅(六):流星、烟花、火焰、下雪、下雨粒子特效

晓石头的博客 邮箱:178673693@qq.com 转载请注明出处,原文链接: 效果演示 一、整体实现 点击每一个菜单选项,显示相应的的特效。分别对应:流星、烟花、火焰、下雪、下雨。  ...

原创2D/3D游戏引擎源代码开源

  • 2014年07月16日 20:26
  • 327B
  • 下载

原创2D/3D游戏引擎源代码开源

早期的作品代码结构较差,对大家造成的误导敬请谅解。我会不断的更新个人作品,请大家始终参考最新的源码。在此感谢热心网友给我提的宝贵意见。...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[原创]irrlicht 3d游戏武器粒子特效的实现2
举报原因:
原因补充:

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