MS RFC 50:OpenGL渲染支持

日期

2008/12/23

作者

托比·拉希利,乔纳森·伯克

联系

在gmail.com上的toby.rahilly。gmail.com上的bourke.jf

最后编辑

2008/12/23

版本

MAPServer 5.4

概述

此RFC建议在MapServer中添加OpenGL呈现模块,以便更快地呈现图像。

目前,MapServer支持高质量消除混叠图像的agg渲染。尽管agg具有高质量图像的能力,并且比gd渲染快得多,但其速度仍不足以满足需要的用例,如实时点播渲染。

OpenGL被视为一种解决方案,它可以利用专门为实时渲染设计的硬件提供高性能渲染。当前的OpenGL原型能够以比具有类似图像质量的agg快一个数量级的速度呈现地图。

技术解决方案

OpenGL呈现模块的界面和路径将非常类似于当前的agg呈现模块。与agg一样,OpenGL模块将使用gd来进行结果的I/O。然而,由于OpenGL的性质,有一些关键的实现差异值得注意。

OpenGL可以使用预渲染的纹理。所有符号都可以预渲染并存储为OpenGL纹理,当它们用于渲染地图时,渲染的纹理只需通过转换复制到图像缓冲区。这可以极大地提高复杂和重复性很强的符号的性能,例如火车轨道,因为它们不仅需要渲染一次,OpenGL还可以处理重复和转换,这些重复和转换已经过了大量优化。

标签也受益于这种方法,因为整个字母表可以预先渲染和存储为纹理。绘制曲线标签时,OpenGL模块只需放置角色的旋转纹理。

符号的预渲染纹理也可以在不同的地图渲染实例之间共享。因此,建议稍微修改渲染路径,以便在首次加载带OpenGL渲染的映射文件时,所有符号都预渲染并存储在映射对象上。这大大提高了批处理渲染的性能。

agg和opengl的另一个显著区别是opengl不能渲染到主内存中,而是渲染到视频内存中不可访问的缓冲区中。这意味着图像必须在OpenGGL中呈现到视频内存中,然后在保存结果之前复制到GD图像缓冲区。

C API更改

由于OpenGL模块非常接近于AGG实现,所以对MapServer的核心几乎不需要做任何更改。对以下文件进行细微更改以添加OpenGL的呈现路径:

  • mapdraw.c

  • mapdrawgdal.c

  • maperror.c

  • maplegend.c

  • mapoutput.c

  • mapraster.c

  • mapresample.c

  • maputil.c

不会向这些文件添加新功能,而只会添加其他if块。

OpenGL的大部分功能将在mapogl.cpp中找到。

Mapfile

这样的输出块将触发OpenGL呈现:

OUTPUTFORMAT
  NAME 'OGL_PNG24'
  DRIVER OGL/PNG
  IMAGEMODE RGB
END

问题

  • OpenGL渲染的本质发生在OpenGL驱动程序内部。OpenGL驱动程序因硬件和操作系统而异,呈现技术也因硬件和操作系统而异。这意味着在不同的计算机上渲染的地图可以有不同的结果,例如颜色阴影、抗混叠质量和性能。

  • 尽管OpenGL是跨平台的,但每个操作系统都有不同的方法来设置要呈现的OpenGL上下文。目前,我们有一个针对Vista之前的Windows的实现。

文档

TBD

向后不兼容

不需要任何问题。

臭虫识别码

未分配。