【CEGUI】CEGUI入门篇之初始化(一)[通俗易懂]

【CEGUI】CEGUI入门篇之初始化(一)[通俗易懂]以下内容翻译自http://static.cegui.org.uk/docs/0.8.7/rendering_tutorial.html1、简介初始化CEGUI时,不管其渲染API或渲染引擎是什么,都包括三个基本步骤:(1)创建一个基于CEGUI::Renderer对象的实例。(2)创建CEGUI::System对象,参数为上一步创建的Renderer实例。(3)每一帧都调用CEGUI:

大家好,又见面了,我是你们的朋友全栈君。

以下内容翻译自http://static.cegui.org.uk/docs/0.8.7/rendering_tutorial.html

1、简介

初始化CEGUI时,不管其渲染API或渲染引擎是什么,都包括三个基本步骤:
(1)创建一个基于CEGUI::Renderer对象的实例。
(2)创建CEGUI::System对象,参数为上一步创建的Renderer实例。
(3)每一帧都调用CEGUI::System::renderAllGUIContexts函数进行渲染。

很显然,我们需要加载一些数据并作一些初始化工作,这部分内容将在“CEGUI入门篇之使用ResourceProvider加载资源(二)”和“CEGUI入门篇之数据文件及默认初始化(三)”中介绍,同时为了与CEGUI控件进行交互,还需要注入输入事件到CEGUI系统,这部分内容将在“CEGUI入门篇之事件注入(五)”中介绍。

2、简单方法:使用Renderer的bootstrapSystem函数

在我们选择的渲染API或渲染引擎中,使用相关Renderer类中的静态函数bootstrapSystem是一种让CEGUI跑起来的最快速简单的方法,除非要做一些高级的或不寻常的事情,否则这便是最佳选择,一个函数调用就完成了CEGUI初始化中所有需要创建的对象,另外还有个destroySystem函数用于随后的清理工作。

Ogre3D和Irrlicht引擎各自有它们自己集成的资源加载和图片解析功能,通过实现CEGUI::ResourceProvider和CEGUI::ImageCodec接口来完成,这需要我们创建这些对象并将CEGUI::Renderer对象作为参数传递给CEGUI::System::create函数,这些对象构造过程相对复杂,不过bootstrapSystem函数自动完成了这些操作。

所以,初始化CEGUI就是简单地调用一个bootstrapSystem函数。

OpenGL1.2——

header:

// Bootstrap CEGUI::System with an OpenGLRenderer object that uses the
// current GL viewport, the DefaultResourceProvider, and the default
// ImageCodec.
//
// NB: Your OpenGL context must already be initialised when you call this; CEGUI
// will not create the OpenGL context itself.
CEGUI::OpenGLRenderer& myRenderer =
    CEGUI::OpenGLRenderer::bootstrapSystem();

OpenGL3.2或OpenGL ES2.0——

header:

// Bootstrap CEGUI::System with an OpenGL3Renderer object that uses the
// current GL viewport, the DefaultResourceProvider, and the default
// ImageCodec.
//
// NB: Your OpenGL context must already be initialised when you call this; CEGUI
// will not create the OpenGL context itself. Nothing special has to be done to
// choose between desktop OpenGL and OpenGL ES: the type is automatically
// determined by the type of the current OpenGL context.
CEGUI::OpenGL3Renderer& myRenderer =
    CEGUI::OpenGL3Renderer::bootstrapSystem();

Direct3D——

header:

// Bootstrap CEGUI::System with a Direct3D9Renderer object that uses the
// DefaultResourceProvider, and the default ImageCodec.
CEGUI::Direct3D9Renderer& myRenderer =
 CEGUI::Direct3D9Renderer::bootstrapSystem( myD3D9Device );

Ogre3D——

header:

// Bootstrap CEGUI::System with an OgreRenderer object that uses the
// default Ogre rendering window as the default output surface, an Ogre based
// ResourceProvider, and an Ogre based ImageCodec.
CEGUI::OgreRenderer& myRenderer =
    CEGUI::OgreRenderer::bootstrapSystem();

Irrlicht——

header:

// Bootstrap CEGUI::System with an IrrlichtRenderer object, an Irrlicht based
// ResourceProvider, and an Irrlicht based ImageCodec.
CEGUI::IrrlichtRenderer& myRenderer =
    CEGUI::IrrlichtRenderer::bootstrapSystem( myIrrlichtDevice );

3、复杂方法:手动创建CEGUI对象

有时候出于某种原因不使用bootstrapSystem函数,这就需要手动创建CEGUI初始化时所需的对象,包括基于CEGUI::Renderer的对象和CEGUI::System对象,下面分别介绍。

Direct3D9——

header:

CEGUI::Direct3D9Renderer& myRenderer =
    CEGUI::Direct3D9Renderer::create( myD3D9Device );
CEGUI::System::create( myRenderer );

Direct3D10——

header:

CEGUI::Direct3D10Renderer& myRenderer =
    CEGUI::Direct3D10Renderer::create( myD3D10Device );
CEGUI::System::create( myRenderer );

OpenGL1.2——

header:

// Create an OpenGLRenderer object that uses the current GL viewport as // the default output surface. CEGUI::OpenGLRenderer& myRenderer = CEGUI::OpenGLRenderer::create();
CEGUI::System::create( myRenderer );

OpenGL3.2或OpenGL ES2.0——

header:

// Create an OpenGL3Renderer object that uses the current GL viewport as // the default output surface. CEGUI::OpenGL3Renderer& myRenderer = CEGUI::OpenGL3Renderer::create();
CEGUI::System::create( myRenderer );

Ogre3D——

header:

// Create an OgreRenderer object that uses the default Ogre rendering // window as the default output surface. CEGUI::OgreRenderer& myRenderer = CEGUI::OgreRenderer::create();
CEGUI::System::create( myRenderer );

Irrlicht——

header:

CEGUI::IrrlichtRenderer& myRenderer =
    CEGUI::IrrlichtRenderer::create( myIrrlichtDevice );
CEGUI::System::create( myRenderer );

4、清理工作

最后还要记得清理CEGUI Renderer和CEGUI System,顺序执行下面两个步骤:
(1)销毁CEGUI System。

CEGUI::System::destroy();

(2)销毁CEGUI Render(例如d_renderer的类型为Renderer*,当然也可以是引用,通过static_cast转换为具体的子类OpenGL3Renderer)。

CEGUI::OpenGL3Renderer::destroy(static_cast<CEGUI::OpenGL3Renderer&>(*d_renderer)); 

另外,为了避免内存泄漏,还需要销毁手动创建的GUI Contexts、Textures和GeometryBuffers,而CEGUI的Windows、Images等普通元素则会在Renderer、System销毁时被自动销毁,但是如果在程序运行时创建了大量的Windows等普通元素,也需要手动销毁这些对象以降低内存负荷。

5、渲染GUI

渲染GUI的方法可能因渲染引擎的不同而不同,相同的是在渲染循环最后都要调用CEGUI::System::renderAllGUIContexts函数,对于Ogre3D引擎来说,自动执行了这一函数,其它引擎的用法如下所示。

Direct3D9——

// Start the scene
myD3DDevice->BeginScene();
// clear display
myD3DDevice->Clear(0, 0, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
// user function to draw 3D scene
draw3DScene();
    // draw GUI
    CEGUI::System::getSingleton().renderAllGUIContexts();
// end the scene
myD3DDevice->EndScene();
// finally present the frame.
myD3DDevice->Present(0, 0, 0, 0);

Direct3D10——

// define colour view will be cleared to
float clear_colour[4] = { 0.0f, 0.0f, 0.0f, 1.0f };
// clear display
myD3DDevice->ClearRenderTargetView(myRenderTargetView, clear_colour);
// user function to draw 3D scene
draw3DScene();
    // draw GUI
    CEGUI::System::getSingleton().renderAllGUIContexts();
// present the newly drawn frame.
mySwapChain->Present(0, 0);

OpenGL——

// user function to draw 3D scene
draw3DScene();
// make sure that before calling renderAllGUIContexts, that any bound textures
// and shaders used to render the scene above are disabled using
// glBindTexture(0) and glUseProgram(0) respectively also set
// glActiveTexture(GL_TEXTURE_0) 
    // draw GUI
    // NB: When using the old desktop OpenGL 1.2 renderer, this call should not
    // occur between glBegin/glEnd calls.
    CEGUI::System::getSingleton().renderAllGUIContexts();

Irrlicht——

// start the scene
myIrrlichtDriver->beginScene(true, true, irr::video::SColor(150,50,50,50));
// draw main scene
myIrrlichtSceneManager->drawAll();
    // draw gui
    CEGUI::System::getSingleton().renderAllGUIContexts();
// end the scene
myIrrlichtDriver->endScene();
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/163720.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • tkmapper教程_tkr和tka的区别

    tkmapper教程_tkr和tka的区别tkMapper入门1、tkMapper介绍1.1SpringBoot整合MyBatis以及tkMapper1.2在启动类上修改注解`@MapperScan`2、tkMapper的使用2.1创建数据表2.2创建实体类2.3创建Mapper接口2.4测试3、tkMapper的常用方法3.1类别实体类3.2类别接口增加修改删除查询查询所有根据主键查询条件查询分页查询带条件的分页查询关联查询1、通过多个单表操作实现2、自定义连接查询2.1、在DAO接口自定义方法2.2、创建Mapper文件1、

    2022年10月7日
    0
  • webstorm2021.1激活码(注册激活)

    (webstorm2021.1激活码)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/ide…

    2022年3月29日
    561
  • excel转xml工具_怎样将xml转换成excel

    excel转xml工具_怎样将xml转换成exceltestlink用例导出到excel中

    2022年8月22日
    3
  • 我竟然不再抗拒 Java 的类加载机制了

    我竟然不再抗拒 Java 的类加载机制了很长一段时间里,我对Java的类加载机制都非常的抗拒,因为我觉得太难理解了。但为了成为一名优秀的Java工程师,我决定硬着头皮研究一下。01、字节码在聊Java类加载机制之前,需要先了解一下Java字节码,因为它和类加载机制息息相关。计算机只认识0和1,所以任何语言编写的程序都需要编译成机器码才能被计算机理解,然后执行,Java也不例外。Java在诞生的时候喊出了…

    2022年5月10日
    33
  • Java学习之接口与多态篇

    Java学习之接口与多态篇0x00前言在前面写的几篇文章里,讲了封装和继承,那么这篇文章就来讲讲第三大面向对象的特性多态吧,在此之前先接着上篇文章的抽象先来看看Java里面接口的应用。0x01

    2021年12月11日
    52
  • b站的java教程怎么样(b站学java哪个好)

    Heyguys,这里是cxuan,欢迎你收看我最新一期的文章。这是一篇鸽了很久的文章。。。。。。事情还要从上回说起。。。。。。我爱B站!这篇文章我汇总了B站上计算机基础(操作系统、计算机网络、数据结构和算法、汇编等)学习视频,受到了很多小伙伴的认可和追更。甚至CSDN还有在催我更新的读者朋友所以这篇文章,不能再拖了,更新起来!!!Java基础Java基础:尚硅谷宋红康https://www.bilibili.com/video/BV1Qb411g7cz?from

    2022年4月15日
    156

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号