OpenGL的面向对象封装
我们在基于Kinect的魔法面具项目中需要使用OpenGL来渲染3D模型。OpenGL是基于C语言的图形渲染API,我们在项目中需要加载并渲染多个3D模型,所以需要对OpenGL做一层面向对象的封装。在此前我们团队的成员都没有深入接触过OpenGL,直到这个项目,才知道OpenGL的不同。
首先,OpenGL与线程直接绑定,每个线程渲染的图形都是独立的,这为我们的封装提供了一定的便利。但是由于不了解这个特性,在实际开发中我们总是发现经常出现渲染失败的情况,仅仅是因为一个接口调用的地方不一样,后来经过总结并且查阅相关资料,终于发现是由于OpenGl线程绑定导致的这一现象,对某一个3D模型的渲染必须在同一个线程中进行,而我们的封装有时会出现在A线程初始化,在B线程绘图。
既然OpenGl绑定了线程,那一个线程如何渲染多个3D模型呢。一个一个渲染当然可行,但是我们的程序是基于WINAPI下的窗口程序,3D模型的渲染实际是由事件来触发的,这样的话我们不能保证一个3D模型的渲染不会被同一个线程中其它3D模型的渲染打断!如何解决这个问题呢?OpenGL中有上下文的概念,每个绘图动作都是针对当前的上下文。只要在使用接口前设置上下文即可,在单线程中接口的调用不会被事件打断,这样就实现了在有事件的线程中对不同3D模型的渲染。
设置上下文的接口是:
wglMakeCurrent(hdc,hrc);
附上封装好的OpenGL 类定义:
class Modules_Obj{
public:
Modules_Obj();
~Modules_Obj();
void Init();
bool LoadObj(const char *pcFileName);
bool LoadBmp(LPCWSTR pcBmp);
void Create(HWND hwnd);
bool UpdateBitMap(float x,float y, float z);
HBITMAP GetBitMap()
{
return pBitmap;
};
HDC GetHDC()
{
return hdc;
};
private:
GLMmodel* m_Model;
GLuint model_list;
GLuint material_mode;
GLboolean facet_normal;
GLuint luInt;
HBITMAP pBitmap;
HDC hdc;
HGLRC hrc;//绘制环境
};