3D 引擎 Irrlicht -- Irrlicht 3D 所有 Tutorial 动态图概览

官网:http://irrlicht.sourceforge.net/

把所有官方 Tutorial 跑一遍,可以感受到作者对 OpenGL 底层的封装,一些思路。对 Irrlicht 的能力,也能有一个整体感知。 截图有点困难,还专门写了一个小程序完成截图,每个 demo 都截了动态图,便于查阅。

花了两天完成,Irrlicht 3D 所有 Tutorial 动态图概览。🐬

development code

version svn addr note
下一个版本 svn://svn.code.sf.net/p/irrlicht/code/trunk 可能不稳定或存在 api 变更
1.8.5 bugfix svn://svn.code.sf.net/p/irrlicht/code/branches/releases/1.8 推荐这个
OpenGL ES svn://svn.code.sf.net/p/irrlicht/code/branches/ogl-es 实验性质

Namespace List

irr Everything
irr::core vectors, planes, arrays, lists, and so on
irr::gui graphical user interface
irr::io Reading and writing files, accessing zip archives, xml files, ..
irr::scene Mesh loading, special scene nodes like octrees and billboards, ..
irr::scene::quake3 Quake3 map (.bsp)
irr::video video driver
#ifdef _IRR_WINDOWS_
#pragma comment(lib, "Irrlicht.lib")
#pragma comment(linker, "/subsystem:windows /ENTRY:mainCRTStartup")
#endif

int main();

Tutorials

Name Summary Difficulty Shot
1.HelloWorld VideoDriver, GUIEnvironment and SceneManager. 简单 s001shot.jpg
2.Quake3Map 加载 Quake 3 map,创建 SceneNode 并优化渲染速度,创建可控相机位。 简单 s002shot.jpg
3.Custom SceneNode 创建定制的 scene node,shader 写的。 高级的 s003shot.jpg
4.Movement 移动 SceneNode,创建 SceneNode 动画 SceneNodeAnimators,也可以通过键盘控制移动。 简单 s004shot.jpg
5.User Interface 用内建的 User Interface 创建 windows, buttons, scroll bars, static texts and list boxes。 平均的 s005shot.jpg
6.2D Graphics 2d graphics, draw images, keycolor based sprites, transparent rectangles and different fonts. 简单 s006shot.jpg
7.Collision collision 检测,三种方法:stair climbing,拾取三角形,拾取 scene node。 平均的 s007shot.jpg
8.SpecialFX 特效演示。深度缓冲阴影,粒子系统,广告牌,动态光,水表面。 平均的 s008shot.jpg
9.MeshViewer mesh viewer。涉及用户接口和场景管理。 高级的 s009shot.jpg
10.Shaders shaders for D3D8, D3D9 and OpenGL。创建 shader material,关闭 texture mipmaps,使用 text scene nodes。 高级的 s010shot.jpg
11.Per Pixel Lighting 复杂 material。用 normal maps and parallax mapping 计算每个像素的光照。烟雾的使用,和移动粒子系统。 平均的 s011shot.jpg
12.Terrain Rendering 地形渲染。用地形三角进行物理碰撞检测。 简单 s012shot.jpg
13.Render To Texture 渲染到一个纹理。使用 specular highlights。 平均的 s013shot.jpg
14.Win32 window win32 窗口中使用引擎。 简单 s014shot.jpg
15.Load .irr file 使用 .irr files。 简单 s015shot.jpg
16.Quake3Map Shader q3 map 特效和加载。 平均的 s016shot.jpg
17.Hello World Mobile Windows CE 样例。 高级的 s017shot.jpg
18.SplitScreen split screen 演示。 平均的 s018shot.jpg
19.Mouse And Joystick 手柄和鼠标的使用。 简单 s019shot.jpg
20.Managed Lights 多光源管理。根据场景选择合适的光源。 高级的 s020shot.jpg
21.Quake3Explorer q3 map 浏览器。可以完成管理。 高级的 s021shot.jpg
22.MaterialViewer material 测试,可以手工编辑。 简单 s022shot.jpg
23.SMeshHandling 手工创建 meshes,支持定制处理。 平均的 s023shot.jpg
24.CursorControl 修改 鼠标 cursors。   024shot.jpg
25.XmlHandling XML 的使用,可以用来加载和保存配置。   025shot.jpg
26.OcclusionQuery 用 OcclusionQuery 渲染加速。超出视距的节点不绘制。   026shot.jpg
[27.PostProcessing] 创建屏幕双缓冲。颜色反转,用 HLSL and GLSL 写的。   027shot.jpg
[28.CubeMapping] cubemap textures 使用,和环境 mapping。   028shot.jpg
[29.HardwareSkinning] HardwareSkinning   029shot.jpg
[30.Profiling] 一些 profiling tools。   030shot.jpg
[Demo] 一个完整的游戏 demo。   demoshot.jpg

External Tutorials

Name Summary Difficulty Shot
DevCpp Dev C++ 使用。 简单 s001bshot.jpg
Code::Blocks Code::Blocks IDE 使用。 简单 codeblocks.jpg
Codewarrior Metroworks Codewarrior 使用。 简单 s001cshot.jpg
ODE Integration 物理引擎 ODE。 高级的 odelogo.jpg
Tokamak Integration 物理引擎 Tokamak。 高级的 s008bshot.jpg
PhysX Integration 物理引擎 Ageia PhysX (Novodex)。 高级的 physx.jpg
Newton Integration 物理引擎 Newton Game Dynamics。 高级的 newston.jpg
Newton DevC++ Integration Dev-C++,物理引擎 Newton Physics SDK。 平均的 devcpp_newton.jpg

Hello World $code$

#ifdef _MSC_VER
#pragma comment(lib, "Irrlicht.lib")
#pragma comment(linker, "/subsystem:windows /ENTRY:mainCRTStartup")
#endif

#include <irrlicht.h>
#include "exampleHelper.h"

using namespace irr;
using namespace core;
using namespace scene;
using namespace video;
using namespace io;
using namespace gui;

int main() {
    IrrlichtDevice* device = createDevice(video::EDT_OPENGL, dimension2d<u32>(640, 480), 16, false, false, false, 0);
    device->setWindowCaption(L"Hello World! - Irrlicht Engine Demo");

    IVideoDriver* driver = device->getVideoDriver();
    ISceneManager* smgr = device->getSceneManager();
    IGUIEnvironment* guienv = device->getGUIEnvironment();

    guienv->addStaticText(L"Hello World! This is Irrlicht with the burnings software renderer!", rect<s32>(10, 10, 260, 22), true);

    const io::path mediaPath = getExampleMediaPath();
    IAnimatedMesh* mesh = smgr->getMesh(mediaPath + "sydney.md2");
    IAnimatedMeshSceneNode* node = smgr->addAnimatedMeshSceneNode(mesh);
    if (node) {
        node->setMaterialFlag(EMF_LIGHTING, false);
        node->setMD2Animation(scene::EMAT_STAND);
        node->setMaterialTexture(0, driver->getTexture(mediaPath + "sydney.bmp"));
    }

    smgr->addCameraSceneNode(0, vector3df(0, 30, -40), vector3df(0, 5, 0));
    while (device->run()) {
        driver->beginScene(ECBF_COLOR | ECBF_DEPTH, SColor(255, 100, 101, 140));
        smgr->drawAll();
        guienv->drawAll();
        driver->endScene();
    }

    device->drop();
    return 0;
}

Tutorial 1: HelloWorld

VideoDriver, GUIEnvironment and SceneManager.

Tutorial 2: Quake3Map

加载 Quake 3 map,创建 SceneNode 并优化渲染速度,创建可控相机位。

Tutorial 3: Custom SceneNode

创建定制的 scene node,没有用到 shader。

Tutorial 4: Movement

移动 SceneNode,创建 SceneNode 动画 SceneNodeAnimators,也可以通过键盘控制移动。

Tutorial 5: User Interface

用内建的 User Interface 创建 windows, buttons, scroll bars, static texts and list boxes。

Tutorial 6: 2D Graphics

2d graphics, draw images, keycolor based sprites, transparent rectangles and different fonts.

Tutorial 7: Collision

collision 检测,三种方法:stair climbing,拾取三角形,拾取 scene node。

Tutorial 8: SpecialFX

特效演示。深度缓冲阴影,粒子系统,广告牌,动态光,水表面。

Tutorial 9: Mesh Viewer

mesh viewer。涉及用户接口和场景管理。

Tutorial 10: Shaders

shaders for D3D8, D3D9 and OpenGL。创建 shader material,关闭 texture mipmaps,使用 text scene nodes。

Tutorial 11: Per-Pixel Lighting

逐像素光照、雾、移动光、粒子。复杂 material。用 normal maps and parallax mapping 计算每个像素的光照。烟雾的使用,和移动粒子系统。 Irrlicht 学习笔记 (10)–PerPixelLighting

Tutorial 12: Terrain Rendering

地形渲染。用地形三角进行物理碰撞检测。

Tutorial 13: Render To Texture

渲染到一个纹理。使用 specular highlights。

Tutorial 14: Win32 Window

win32 窗口中使用引擎。

Tutorial 15: Loading Scenes from .irr Files

使用 .irr files。

Tutorial 16: Quake3 Map Shader Support

q3 map 特效和加载。

Tutorial 17: Helloworld mobile

Windows CE 样例。

Tutorial 18: Splitscreen

split screen 演示。分屏技术。将视口分为 4 部分,三个显示 fixed camera 和一个用户控制 camera。 Irrlicht 引擎学习笔记 (14)–Splitscreen

Tutorial 19: Mouse and Joystick

手柄和鼠标的使用。

Tutorial 20: Managed Lights

多光源管理。根据场景选择合适的光源。

光源管理器。为了使用超过 8 个的灯光,注册一个可选光源管理器,允许可以在渲染的时候开关特定灯光。 如果没有注册光源管理器,默认的基于距离(距离照相机)的流程将被激活。

  • NO_MANAGEMENT: 关闭光源管理器,展示引擎默认的光源行为。将依据照相机与灯光距离,选择最进的 8 个光源。
  • LIGHTS_NEAREST_NODE: 展示为每个场景节点启用有限数量的光源。如果为正在渲染的节点找到了三个光源,启用它们而关闭其他的光源,这里可行。 但是应用到整个场景,就处理不好了。会看到闪烁现象,这是由于光源在切换其所关联的节点造成的。
  • LIGHTS_IN_ZONE: 展示依据 "zone" 来开关光源的技术。每个空的场景节点作为一个 zone 的父节点。 当节点被渲染的时候,关闭所有光源,找到父 "zone" 节点并打开在其内的光源。 这能为每个节点实现,实现本地光源的效果。这可以用于单个房间内绑定本地光源,而每个房间光源与其他房间的光源是隔离的。

Irrlicht 引擎学习笔记 (15)–LightManager

Tutorial 21: Quake3 Explorer

q3 map 浏览器。可以完成管理。

Tutorial 22: Material Viewer

material 测试,可以手工编辑。

Tutorial 23: SMeshBufferHandling

手工创建 meshes,支持定制处理。

Tutorial 24: CursorControl

修改 鼠标 cursors。

Tutorial 25: Xml Handling

XML 的使用,可以用来加载和保存配置。

Tutorial 26: OcclusionQuery

用 OcclusionQuery 渲染加速。超出视距的节点不绘制。

27.PostProcessing

创建屏幕双缓冲。颜色反转,用 HLSL and GLSL 写的。

28.CubeMapping

cubemap textures 使用,和环境 mapping。

29.HardwareSkinning

HardwareSkinning

30.Profiling

一些 profiling tools。

Demo

一个完整的游戏 demo。

fonttool & guieditor

MeshConverter.exe

Usage: MeshConverter.exe [options] <srcFile> <destFile>
  where options are
 --createTangents: convert to tangents mesh is possible.
 --format=[irrmesh|collada|stl|obj|ply]: Choose target format

八叉树 Octree

如在室内场景管理中有两个经常用到的层次体系:BSP(Binary Space Partitioning) 树,这是八叉树的推广,和包围体树 (Boundingvolume tree)。前者用于加速剔除,而后者主要用于碰撞检测。

一般来说,对于室内场景使用 BSP 树,因为 1)室内场景遮挡比较严重,使用 BSP 树在特定的位置分割有助于提升效率;2)室内很可能朝某个方向延伸比较多,比如一条细长的走廊。 对于大规模室外场景,使用八叉树比较好,因为场景中的物体比较分散,而且不会出现太多的遮挡, 由于不用存储分割平面位置,使用八叉树这种规则的空间结构能够提高效率。 当然,如果这个大规模室外场景的物体主要集中在地面,使用四叉树进行空间管理会比较好。

Refs


参考资料快照
参考资料快照

本文短链接:
If you have any questions or feedback, please reach out .