Irrlicht学习备忘录——16 Quake3MapShader

本文介绍了使用Irrlicht游戏引擎加载和渲染Quake3地图的示例,详细讲解了代码实现,包括不同级别的渲染效果,并展示了如何处理Quake3地图的Shader。通过对代码的分析,读者可以了解如何在Irrlicht中实现Quake3竞技场级别的场景渲染。
摘要由CSDN通过智能技术生成

16 Quake3MapShader

    官方代码($sdk)\examples\16.Quake3MapShader


    这个例子很像第2个官方例子,使用的场景模型也跟那例子用的。唯一的区别是,这个例子中增加了对Quake3压缩地图的场景进行更高级点的渲染,使它看起来比第2个例子更好。下面看具体代码。

#include <irrlicht.h>

#include "driverChoice.h"

 

//下面的宏用来定义Quake3允许载入的级别

#define IRRLICHT_QUAKE3_ARENA

//#define ORIGINAL_QUAKE3_ARENA

//#define CUSTOM_QUAKE3_ARENA

//#define SHOW_SHADER_NAME

//共有2个级别,例子里默认使用的是IRRLICHT_QUAKE3_ARENA,它是irr的Quake3渲染级别。另外一个是Quake3竞技场原始效果级别ORIGINAL_QUAKE3_ARENA。使用Quake3竞技场原始效果级别时,可以开启用户自定义效果CUSTOM_QUAKE3_ARENA宏。通过注释和取消注释来编译,可以看到不同级别的渲染效果。SHOW_SHADER_NAME宏用来开启关闭显示场景中用到的quake3 shader的名字。

 

//如果定义了ORIGINAL_QUAKE3_ARENA

#ifdef ORIGINAL_QUAKE3_ARENA

    //定义QUAKE3_STORAGE_FORMAT宏

   #define QUAKE3_STORAGE_FORMAT   addFolderFileArchive

    //定义QUAKE3_STORAGE_1宏

   #define QUAKE3_STORAGE_1   "/baseq3/"

    //如果定义了CUSTOM_QUAKE3_ARENA

   #ifdef CUSTOM_QUAKE3_ARENA

       //定义QUAKE3_STORAGE_2宏

       #define QUAKE3_STORAGE_2   "/cf/"

       //定义QUAKE3_MAP_NAME宏

       #define QUAKE3_MAP_NAME   "maps/cf.bsp"

   #else

    //定义QUAKE3_MAP_NAME宏

   #define QUAKE3_MAP_NAME   "maps/q3dm8.bsp"

   #endif

#endif

 

//如果定义了IRRLICHT_QUAKE3_ARENA宏

#ifdef IRRLICHT_QUAKE3_ARENA

    //定义QUAKE3_STORAGE_FORMAT宏

   #define QUAKE3_STORAGE_FORMAT   addFileArchive

    //定义QUAKE3_STORAGE_1宏

   #define QUAKE3_STORAGE_1   "../../media/map-20kdm2.pk3"

    //定义QUAKE3_MAP_NAME宏

   #define QUAKE3_MAP_NAME   "maps/20kdm2.bsp"

#endif

 

using namespace irr;

using namespace scene;

#ifdef _MSC_VER

#pragma comment(lib,"Irrlicht.lib")

#endif

 

//截屏类。这个类继承IEventReceiver事件接收接口,用来检查用户操作按键情况,在按下F9键时进行屏幕截屏。

class CScreenShotFactory : publicIEventReceiver

{

public:

   //device irr设备、templateName截屏临时名字、node场景节点(本例中没用到)

   CScreenShotFactory( IrrlichtDevice *device, const c8 * templateName,ISceneNode* node )

       : Device(device), Number(0), FilenameTemplate(templateName), Node(node)

    {

       FilenameTemplate.replace ( '/', '_' );

       FilenameTemplate.replace ( '\\', '_' );

    }

   bool OnEvent(const SEvent& event)

    {

       //检查是否是键盘按下事件

       if ((event.EventType ==

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值