Irrlicht学习之光照的研究

最近研究一下Irrlicht的光照。发现Irrlicht的光照还是比较简单的,相比低于它的OpenGL和Direct3D,设置光源以及设置光照的参数更加人性化(可能是因为OpenGL是基于C的,Direct3D是基于COM的,都没有面向对象那么简洁易懂?)但是光照的实现还是根据底层的渲染器来决定的,也就是说可能是OpenGL的高洛德光照模型,也可能是Direct3D中的光照模型。

演示程序和源代码下载地址:这里

为了准确地展现Irrlicht设置和显示光照的特性,需要载入一个场景模型。这里我从游艺网中下载了一个max模型,然后通过3DS Max转为obj格式,这样能被Irrlicht识别并显示。模型在载入后需要设置其材质以便能够接受到光照。下面是设置的代码:

pDoorNode->setMaterialFlag(EMF_LIGHTING, true );// 接受光照
pDoorNode->setMaterialFlag(EMF_ANISOTROPIC_FILTER, true );// 使用各向异性过滤
pDoorNode->setMaterialType(EMT_TRANSPARENT_ALPHA_CHANNEL_REF );// 材质开启Alpha通道

这里第一句是让Irrlicht的光照能够作用于该节点的材质上;第二句是使用各项异性过滤,通常在投影的时候能够在远处获得清晰的过滤效果;第三句则是开启材质的Alpha通道,能够解决一些Alpha以及深度的问题,具体功能还需探究(可以注释掉来看看效果)。

在进行完准备工作后,开始设置光照了。就我的学习实践来说会分为这几步:

1、设置全局光颜色;

2、向场景添加光源节点(俗称打灯);

3、设置各个光源的属性。

光源的属性有漫反射颜色、镜面反射颜色、自发光颜色等,OpenGL和Direct3D所有的Irrlicht应该也不会缺少(有关光源的属性参见我以前写的一篇日志)。所不同的是,Irrlicht的光源作为节点属性成为场景管理的一部分,这和Blender和其它成熟3D建模软件的场景管理属性差不多。

下面是演示程序的截图,截图中开了四盏灯,分别位于四个火把的位置。原作者似乎只想制作一个静态的模型,所以火把什么的没有做成粒子系统,而是一张面片而已。程序还创建了一个FPS摄像机,我们可以很方便地对场景进行漫游。

下面是程序的部分代码:

#include "IrrInclude.h"

void CreateMap( ISceneManager* pSMgr )
{
IMesh* pDoorMesh = pSMgr->getMesh( "Door/Door.obj");
if ( pDoorMesh == nullptr ) return; ISceneNode* pDoorNode = pSMgr->addMeshSceneNode( pDoorMesh );
if ( pDoorNode == nullptr ) return; pDoorNode->setMaterialFlag( EMF_LIGHTING, true );// 接受光照
pDoorNode->setMaterialFlag( EMF_ANISOTROPIC_FILTER, true );// 使用各向异性过滤
pDoorNode->setMaterialType( EMT_TRANSPARENT_ALPHA_CHANNEL_REF);// 材质开启Alpha通道 // 设置全局光照
pSMgr->setAmbientLight( SColor( 255, 80, 0, 0 ) ); // 添加点光源
ILightSceneNode* pBlueFireLight_1 = pSMgr->addLightSceneNode(pDoorNode );
ILightSceneNode* pBlueFireLight_2 = pSMgr->addLightSceneNode(pDoorNode );
ILightSceneNode* pRedFireLight_1 = pSMgr->addLightSceneNode(pDoorNode );
ILightSceneNode* pRedFireLight_2 = pSMgr->addLightSceneNode(pDoorNode ); SLight blueFireLight;
blueFireLight.DiffuseColor = SColor( 255, 80, 80, 225 );
blueFireLight.SpecularColor = SColor( 255, 230, 230, 210 ); SLight redFireLight;
blueFireLight.DiffuseColor = SColor( 255, 225, 80, 80 );
blueFireLight.SpecularColor = SColor( 255, 230, 230, 210 ); // 设置光源属性
pBlueFireLight_1->setLightData( blueFireLight );
pBlueFireLight_1->setPosition( vector3df( 7.0f, 12.0f, 9.0f )); pBlueFireLight_2->setLightData( blueFireLight );
pBlueFireLight_2->setPosition( vector3df( -7.0f, 12.0f, 9.0f )); pRedFireLight_1->setLightData( redFireLight );
pRedFireLight_1->setPosition( vector3df( 20.0f, 2.0f, 6.0f )); pRedFireLight_2->setLightData( redFireLight );
pRedFireLight_2->setPosition( vector3df( -20.0f, 2.0f, 6.0f )); } void CreateGUI( IGUIEnvironment* pGUIEnv )
{
// 创建中文字体
IGUIFont* pChineseFont = CGUITTFont::createTTFont(
pGUIEnv, // GUI环境
FONTPATH, // 字体名称
20, // 字体大小(多少磅)
true, // 抗锯齿吗?
true ); // 半透明吗? // 设置GUI风格
pGUIEnv->getSkin( )->setFont( pChineseFont );
pGUIEnv->getSkin( )->setColor( EGDC_BUTTON_TEXT, SColor(255, 255, 255, 255 ) );
} int main( int argc, char** argv )
{
IrrlichtDevice* pDevice = createDevice(
EDT_OPENGL, // 渲染设备
dimension2d<u32>( 640, 480 ), // 宽和高
16, // 颜色位
false, // 是否全屏
false, // 模版缓存
false, // 垂直同步
nullptr ); // 事件接收器 if ( pDevice == nullptr ) return -1;
pDevice->setWindowCaption( L"鬼火引擎演示- 光照的研究" ); IVideoDriver* pDriver = pDevice->getVideoDriver( );
ISceneManager* pSMgr = pDevice->getSceneManager( );
IGUIEnvironment* pGUIEnv = pDevice->getGUIEnvironment( ); CreateMap( pSMgr );// 创建地图
ICameraSceneNode* pCamera = pSMgr->addCameraSceneNodeFPS(
nullptr,
100.0f,
0.2f );
pCamera->setPosition( vector3df( -4.0f, -4.0f, 12.0f ) );
pCamera->setRotation( vector3df( 0.0f, 90.0f, 90.0f ) ); CreateGUI( pGUIEnv );// 创建GUI
IGUIStaticText* pInfoText = pGUIEnv->addStaticText( L"", rect<s32>( 10, 10, 400, 100 )); pDevice->getCursorControl( )->setVisible( false );// 隐藏鼠标光标 while ( pDevice->run( ) )
{
vector3df pos = pCamera->getPosition( );
wchar_t info[100] = { 0 };
swprintf( info, L"当前摄像机坐标(%.2f,%.2f, %.2f)\nMade By Jiangcaiyang",
pos.X, pos.Y, pos.Z );
pInfoText->setText( info ); pDriver->beginScene(
true, //后台缓存
true, //Z缓存
SColor( 0, 0, 0, 0 ) ); // 填充颜色
pSMgr->drawAll( );
pGUIEnv->drawAll( );
pDriver->endScene( );
} return 0;
}

Irrlicht学习之光照的研究的更多相关文章

  1. J2EE学习中一些值得研究的开源项(转)

    这篇文章写在我研究J2SE.J2EE近三年后.前3年我研究了J2SE的Swing.Applet.Net.RMI.Collections. IO.JNI……研究了J2EE的JDBC.Sevlet.JSP ...

  2. Nagios学习实践系列——配置研究[监控当前服务器]

    其实上篇Nagios学习实践系列——基本安装篇只是安装了Nagios基本组件,虽然能够打开主页,但是如果不配置相关配置文件文件,那么左边菜单很多页面都打不开,相当于只是一个空壳子.接下来,我们来学习研 ...

  3. 集合类学习之Hashmap机制研究

    1.遍历的两种实现方法 //新建 Map map=new HashMap(); //存储值 map.put() ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 //遍历方式 ...

  4. Ueditor之前后端源码的学习和简单的研究

    这是我的项目目录 这里写图片描述 1.从访问路径http://localhost:8081/Test/_examples/simpleDemo.html,我们主要是要看看,富文本框被加载出来之前,会调 ...

  5. HBase学习笔记-HBase性能研究(1)

    使用Java API与HBase集群交互时,需要构建HTable对象,使用该对象提供的方法来进行插入/删除/查询等操作.要创建HTable对象,首先要创建一个带有HBase集群信息的配置对象Confi ...

  6. 学习es6 setter/getter研究

    1.背景 在ES6中,我们对类的定义如下 class Person { // 构造函数 constructor (name) { // 属性初始化 this.name = name; } // 成员方 ...

  7. Arduino小车学习与研究

    信安系统设计基础实践模块 Arduino小车学习与研究 ================== 陈都(20135328) 余佳源(20135321) 莫凡(20135225) ---------- 索引 ...

  8. Arduino小车学习与研究博客

    Arduino小车学习与研究博客 信安系统设计基础实践模块 Arduino小车学习与研究 ================== 陈都(20135328) 余佳源(20135321) 莫凡(201352 ...

  9. 深度学习结合SLAM研究总结

    博客转载自:https://blog.csdn.net/u010821666/article/details/78793225 原文标题:深度学习结合SLAM的研究思路/成果整理之 1. 深度学习跟S ...

随机推荐

  1. js常用的一些正则验证文本框

    只允许输入数字和-onKeyUp="value=value.replace(/[^-\d]/g,'')" onafterpaste="value=value.replac ...

  2. 超强1000 JQuery插件

    转载:超强1000个jquery插件! http://www.cnblogs.com/chu888chu888/archive/2011/12/18/2292014.html

  3. 一劳永逸让windows 64位操作系统 禁止强制驱动签名

    如何让WINDOWS7 64位直接加载“禁用强制驱动程序签名”方式启动  Windows Client 论坛 > Windows 7 问题 0 登录进行投票 因为开发需要,要装一台设备的驱动,但 ...

  4. 转:命令和查询责任分离(CQRS)架构模式

    读了“蓝皮书”距今差不多一年,它改变了我的软件开发和构建软件架构观.在我作为一名程序员期间,我尝试了许多不同的方式来构建软件.方法有很多,包括一个贫血的域模型(Anemic Domain Model) ...

  5. Windows Azure HDInsight 支持预览版 Hadoop 2.2 群集

     Windows Azure HDInsight 支持预览版 Hadoop 2.2 群集 继去年 10 月推出 Windows Azure HDInsight 之后,我们宣布 Windows Az ...

  6. java 值传递和引用传递。

    java中 基本类型的参数传递是值传递,即前后两个方法的变量不相干,被调方法参数值改变不影响调用方法的传参数值. 引用数据类型的参数传递是 传递的是参数的地址.即被调方法修改参数值会,调用方法里会跟着 ...

  7. Android实现应用下载并自动安装apk包

    安装: ? 1 2 3 4 5 String str = "/CanavaCancel.apk"; String fileName = Environment.getExterna ...

  8. Android JNI入门第一篇——HelloJni

    android支持使用NDK开发C程序,关于配置NDK环境问题应该不用再赘述了,这个网上有很多,这里通过一篇实例来讲述简单的JNI开发,大家可以参考这篇文章(Get Your Eclipse-Inte ...

  9. 【JAVA】修改项目包名

    从最后一层开始修改,一步步往上递增修改.

  10. python之高阶函数编程

    在这篇文章中我指出两点: 第一:系统函数可以被覆盖 比如: a=abs(-10) print a 10 但是,如果把函数本身赋值给变量呢? f = abs f <built-in functio ...