Irrlicht学习之光照的研究
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学习之光照的研究的更多相关文章
- J2EE学习中一些值得研究的开源项(转)
这篇文章写在我研究J2SE.J2EE近三年后.前3年我研究了J2SE的Swing.Applet.Net.RMI.Collections. IO.JNI……研究了J2EE的JDBC.Sevlet.JSP ...
- Nagios学习实践系列——配置研究[监控当前服务器]
其实上篇Nagios学习实践系列——基本安装篇只是安装了Nagios基本组件,虽然能够打开主页,但是如果不配置相关配置文件文件,那么左边菜单很多页面都打不开,相当于只是一个空壳子.接下来,我们来学习研 ...
- 集合类学习之Hashmap机制研究
1.遍历的两种实现方法 //新建 Map map=new HashMap(); //存储值 map.put() ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 //遍历方式 ...
- Ueditor之前后端源码的学习和简单的研究
这是我的项目目录 这里写图片描述 1.从访问路径http://localhost:8081/Test/_examples/simpleDemo.html,我们主要是要看看,富文本框被加载出来之前,会调 ...
- HBase学习笔记-HBase性能研究(1)
使用Java API与HBase集群交互时,需要构建HTable对象,使用该对象提供的方法来进行插入/删除/查询等操作.要创建HTable对象,首先要创建一个带有HBase集群信息的配置对象Confi ...
- 学习es6 setter/getter研究
1.背景 在ES6中,我们对类的定义如下 class Person { // 构造函数 constructor (name) { // 属性初始化 this.name = name; } // 成员方 ...
- Arduino小车学习与研究
信安系统设计基础实践模块 Arduino小车学习与研究 ================== 陈都(20135328) 余佳源(20135321) 莫凡(20135225) ---------- 索引 ...
- Arduino小车学习与研究博客
Arduino小车学习与研究博客 信安系统设计基础实践模块 Arduino小车学习与研究 ================== 陈都(20135328) 余佳源(20135321) 莫凡(201352 ...
- 深度学习结合SLAM研究总结
博客转载自:https://blog.csdn.net/u010821666/article/details/78793225 原文标题:深度学习结合SLAM的研究思路/成果整理之 1. 深度学习跟S ...
随机推荐
- 使用Project进行挣值分析
挣值分析(EV)技术是一种根据项目的成本基准来度量和分析项目绩效的方法.挣值分析的结果可以指出项目在成本和进度方面存在的偏差.EV分析结合了成本,进度,已完成工作等各种因素来衡量项目的绩效,并 ...
- linux历史发展
1.什么是开源? 开源就是软件和源代码都是公开的. 可以修改(完善作者的代码)和创建自己的软件. 2.免费软件不同于自由软件,虽然它是免费的,但他不公布源代码,共享软件与免费软件有点类似,其初起是不收 ...
- 一个int 数组,里面数据无任何限制,要求求出所有这样的数a[i],其左边的数都小于等于它,右边的数都大于等于它。能否只用一个额外数组和少量其它空间实现。
一个int数组, 比如 array[],里面数据无任何限制,要求求出 所有这样的数array[i],其左边的数都小于等于它,右边的数都大于等于它.能否只用一个额外数组和少量其它空间实现. 分析:这题很 ...
- GCD自己做的一些简单总结
GCD总结 GCD Grand Central Dispatch 牛逼的中枢调度器 GCD中各种队列的执行效果 想看线程 必须是异步函数 并且不是主队列 注意:使用sync函数往当前串行队列添 ...
- plsql developer连接64位Oracle11g的解决方法
1)安装Oracle 11g 64位 2)安装32位的Oracle客户端( instantclient-basic-win32-11.2.0.1.0)下载地址:http://www.oracle.co ...
- 【转】 利用spring的profile切换不同的环境
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...
- FreeCodeCamp:Confirm the Ending
要求: 检查一个字符串(str)是否以指定的字符串(target)结尾. 如果是,返回true;如果不是,返回false. 结果: confirmEnding("Bastian", ...
- UVA 674 Coin Change(dp)
UVA 674 Coin Change 解题报告 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87730#problem/ ...
- C指针陷阱
问题一: #include <stdio.h> int main(int argc, char *argv[]) { ]={ ,,,, }; ); printf(),*(p-)); ; } ...
- Clob对象转为字符串
项目中遇到一个问题,对方公司把打印好的报表数据存到数据库中,实际上就是把html存在Oracle中,然后需要我们在社保系统里进行查询. 但是他们把数据存放在B数据库,而我们的社保系统用的数据库是B.A ...