读书人

一种让程序支持多渲染器的步骤

发布时间: 2013-10-18 20:53:13 作者: rapoo

一种让程序支持多渲染器的方法

一种让程序支持多渲染器的方法

在实际开发中,我们往往倾向于使用新的渲染器API进行图形的绘制,但是担心当部署到目标机器上时,由于硬件和显卡配置的限制而无法使用新的渲染器API。这可真让开发者们头疼。由于不同模型的格式不一样,渲染的方法也不尽相同,再加上渲染器的千变万化,让我们的工作量加大了很多!

一种解决方案是使用游戏引擎来解决问题。本文并不是介绍究竟如何使用这些引擎,而是提出了一种自己的方案,通过为每一个渲染器写一个渲染处理器(render handler)来化解这性能和兼容性的矛盾。

实例:我在开发的时候层考虑如果使用了在OpenGL1.5中提出来的VBO,那么移植到目标机器上时可能会抛弃那些并不支持OpenGL1.5规范的机器(因为可能显卡驱动没有安装等原因而无法支持OpenGL1.5规范)。不过使用glBegin()、glEnd()这样一个顶点一个顶点地添加的确会降低性能,想用VBO来提高性能。怎么办呢?

使用C++的多态机制可以解决问题。根据多次游戏程序编写的经验,我发现一般资源都会经过初始化、使用和回收三个过程,所以我将这三个过程作为纯虚函数提炼出来。成为了IRenderHandler接口。

// 看看OpenGL标准来决定渲染器if ( QGLFormat::openGLVersionFlags( ) &QGLFormat::OpenGL_Version_1_5 ){   m_pRenderHandler.reset( new MMDRenderHandler_1_5 );}else if ( QGLFormat::openGLVersionFlags( )& QGLFormat::OpenGL_Version_1_1 ){   m_pRenderHandler.reset( new MMDRenderHandler_1_1 );}

在开发中,我接触过一游戏引擎,我看到它们对渲染器的封装很深,不过不外乎在渲染时有BeginRender()和EndRender()这样的函数。BeginRender()这样的函数我想意义在于将顶点缓存暴露出来供用户填充数据进来,而EndRender()函数则是结束用户的顶点输入,提交顶点。这里BeginRender()和EndRender()看起来和glBegin()、glEnd()的作用差不多,但由于一些特殊而高效的数据结构使得游戏引擎的执行效率很高。BeginRender()和EndRender()这对函数还包含了对渲染器代码的封装,使得使用跨渲染器的游戏引擎成为可能。

读书人网 >编程

热点推荐