870920 Menu

使用OpenGL加速渲染

完成图形、图像和字型的绘制时,JUCE默认使用其原生的、基于软件算法的LowLevelGraphicsSoftwareRenderer。该类继承自LowLevelGraphicsContext抽象基类。

不少JUCE用户对Windows下字型渲染的效果颇有微词,排除字体本身和Windows在字型渲染方面独有的hint等因素之外,如果确实想实现Windows下那种纤细、锐利、带锯齿的字型渲染效果,一个关键步骤是:派生LowLevelGraphicsContext的子类,调用平台相关的win 32函数,而后做一些调整和优化,即可实现。

除此之外,所有界面元素还可使用OpenGL渲染引擎。OpenGL的渲染速度极快,JUCE类库对其进行了良好的封装,使用及其简单。首先在Introjucer创建项目时启用juce_opengl模块,而后在内容组件类中:

1、声明OpenGLContext对象:

2、设置要渲染的组件(该组件需在attachTo()之前完成创建、添加与显示):

3、析构函数中必须解除OpenGL渲染,其他函数中临时解除渲染也可使用该语句:

如需使用后台线程进行渲染,则OpenGLContext类创建对象后首先调用setRenderer(),指定所用的OpenGLRenderer堆对象。

OpenGLRenderer是一个抽象基类,其作用是自动开辟并使用后台线程渲染OpenGL。该类的3个纯虚函数为:

  • newOpenGLContextCreated () 创建新的OpenGL环境后自动调用此函数
  • renderOpenGL () 渲染OpenGL的下一帧时自动调用此函数
  • openGLContextClosing () 关闭当前OpenGL环境时自动调用此函数

OpenGLContext对组件进行渲染的内部流程是:首先调用组件类的paint()函数进行渲染。如果此时指定了后台渲染所需的OpenGLRenderer对象,则使用该对象继续进行后台渲染。如果打算进一步提高渲染速度,可在setRenderer()之后使用以下语句:

若将setComponentPaintingEnabled()默认设置为true,则渲染时首先调用组件类的paint()函数。

JUCE类库中与OpenGL有关的其他类:
 Draggable3DOrientation 可鼠标拖拽的3D矩阵(视图)
 OpenGLHelpers OpenGL助手类,提供了一批相关的函数
 OpenGLImageType 在一个OpenGL帧缓冲中保存图像数据
 OpenGLPixelFormat 该类的public数据成员代表OpenGL位图的各种属性
 OpenGLRenderer 抽象基类,使用后台线程渲染OpenGL
 OpenGLShaderProgram OpenGL着色器
 OpenGLTexture 基于图像创建一个OpenGL纹理
 OpenGLTextureFromImage 渲染时作为局部对象,从图像中快速创建一个临时纹理
 OpenGLFrameBuffer OpenGL帧缓冲
 Matrix3D 4X4变换矩阵
 Vector3D 3D矢量坐标点
 Quaternion 四元数组 (一个3D矢量和一个比例值)

以上诸类的使用均不复杂。对OpenGL的使用,JUCE Demo中有精彩的示例与演示,可做参考。