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. JAVA 对象内存分析

    1.jmap -heap pid 或者 jmap -histo pid 2.jmap -dump:file=folder/dumpFileName.txt,format=b pid 3.对3的输出文件 ...

  2. HDU3863:No Gambling

    Problem Description One day, Flyvan introduced a new game to his two friends, Oregon Maple and Grape ...

  3. jbpmAPI-6

    第六章流程. 6.1. What is BPMN 2.0 业务流程模型和符号(BPMN)2.0规范是OMG规范,不仅定义了一个标准的业务流程的图形化表述(如BPMN 1. x),但现在还包括执行语义定 ...

  4. scrapy写爬虫是出现no module named win32api错误

    windows下利用scrapy(python2.7)写爬虫,运行 scrapy crawl dmoz 命令时提示:exceptions.ImportError: No module named wi ...

  5. 09-C语言数组

    目录: 一.使用xcode编辑工具 二.数组 三.数组遍历 四.多维数组 回到顶部 一.使用xcode编辑工具 1 打开xcode程序 2 创建一个项目 OSX -> Application - ...

  6. javascript中处理引号编码&#034;

    1. <c:out value='${jxOrgJsonStr}' escapeXml="false"/> 2.或者使用innerText 直接接受${jxOrgJso ...

  7. Codeforces Round #261 (Div. 2)——Pashmak and Buses

    题目链接 题意: n个人,k个车,d天.每一个人每天能够坐随意一个车.输出一种情况保证:不存在两个人,每天都在同一辆车上 (1 ≤ n, d ≤ 1000; 1 ≤ k ≤ 109). 分析: 比赛中 ...

  8. [译]Stairway to Integration Services Level 5 - 增量删除数据

    在 dbo.Contact中添加一行记录 Use AdventureWorks go Insert Into dbo.Contact (FirstName, MiddleName, LastName, ...

  9. Jmeter 发送json{Jfinal 接口req rsp均为json}

    链接地址:http://yangyoupeng-cn-fujitsu-com.iteye.com/blog/2013649 使用jmeter发送json数据.方法有三种 原创,转载请注明出处 1.利用 ...

  10. BZOJ 1639: [Usaco2007 Mar]Monthly Expense 月度开支( 二分答案 )

    直接二分答案然后判断. ----------------------------------------------------------------------------- #include&l ...