irrlicht渲染的一帧(可以把irrlicht修改为纯opengl es实现)

以下是我总结的irrlicht的渲染的一帧

irrlicht的渲染细节我基本看完了,本人很懒,写文章只是些梗概,大家可以简单看看,具体看代码去

createDevice-->createDeviceEx(const SIrrlichtCreationParameters& params)-->根据平台参数的,选择跨平台中的具体哪一个作为渲染实现

CIrrDeviceWin32::CIrrDeviceWin32          这里假如是win32平台的参数这个参数;什么跨平台的玩意就这这里实现了

createDriver();   这里是根据不同的参数,创建不同类型的渲染器,opengl  d3d什么的,这里我仅仅队opengl的东西详细看

createOpenGLDriver()     创建一个oepngl的渲染---》

COpenGLDriver::COpenGLDriver   --》      构造函数      
initDriver    创建什么双缓存之类的东西,完成opengl使用的初始化操作

bool COpenGLDriver::genericDriverInit() ---->这里是队opengl的一些初始化
void COpenGLDriver::createMaterialRenderers()              这里看到创建了一些默认的内部材质,OnSetMaterial中实现opengl状态机的切换过程

还能看到实现的normal  map render等,其实是irrlicht实现的一个带有shader的渲染的render的实例。COpenGLParallaxMapRenderer、COpenGLNormalMapRenderer就是irrlicht提供的具体的渲染shader 材质的自带的render,我们自己也可以写自己的render,很扯淡啦……


写到这里感觉irrlicht的渲染基本理解完成
架构很简单…………………………
irrlicht很小,源代码只有几百个文件,这种级别的引擎对程序员的理解和掌握是有好处的,但是你要用他实现项目,自己需要完成的东西就很多啊……

下面看看irrlicht的渲染的一帧吧,我是一个技术控,不了解底层睡不着觉的人:
void CSceneManager::drawAll()  渲染所有三维层面的场景,ui的那个渲染我就不谈了

// reset all transforms  太直接了,就是重置mvp的那些东西
Driver->setMaterial(video::SMaterial());
Driver->setTransform ( video::ETS_PROJECTION, core::IdentityMatrix );
Driver->setTransform ( video::ETS_VIEW, core::IdentityMatrix );
Driver->setTransform ( video::ETS_WORLD, core::IdentityMatrix );
for (i=video::ETS_COUNT-1; i>=video::ETS_TEXTURE_0; --i)
Driver->setTransform ( (video::E_TRANSFORMATION_STATE)i, core::IdentityMatrix );

//是否允许透明的物体在深度缓存的写入
Driver->setAllowZWriteOnTransparent(Parameters.getAttributeAsBool( ALLOW_ZWRITE_ON_TRANSPARENT) );
动画,是不是很简单
OnAnimate(os::Timer::getTime());

//获得主相机的位置,如果场景中没有相机,那么第一个相机就是主相机,就这么简单
camWorldPos.set(0,0,0);
if (ActiveCamera)
{
ActiveCamera->render(); //render其实主要的就是把pro矩阵设置作用   Driver->setTransform ( video::ETS_PROJECTION……)
camWorldPos = ActiveCamera->getAbsolutePosition();  //获得相机在真实世界坐标系中的位置
}

OnRegisterSceneNode:就是把所有的node加到场景中去



你可能感兴趣的:(opengl,es,irrlicht)