OpenCSG基于图像 CSG 的库

联合创作 · 2023-09-29 18:11

OpenCSG是一个基于图像CSG的库,CSG使用OpenGL渲染。OpenCSG使用c++编写,并支持Microsoft Windows或Linux操作系统下最先进的图形硬件。

什么是CSG呢?CSG是Constructive Solid Geometry(构造实体几何)的缩写,它使用简单的3D图形来构造复杂图形。也就是说,通过附加或求差的方法可以进行图形的组合,那些不是由CSG操 作产生的最基本的图形称之为primitives(基元),基元必须是实体,即基元必须要有明确的内部或者外部定义。通过构建,一个CSG也一定是实体。

基于图像的CSG渲染(深度缓冲区CSG渲染)是一个专用名词,它为几何边界未经过明确计算的 CSG形状指定渲染算法,这种算法使用图形硬件的帧缓冲区设置,如深度缓存或模板缓存,来构建CSG形状。OpenCSG实现多种算法结合,其中就有 goldfeather算法和SCS算法。

优点:

CSG是经常被用作在CAD/CAM应用程序中的基本建模技术。这里,基于图像的CSG是交互操作CSG形状的关键。由于OpenCSG对更复杂的图像渲染较为快速,所以它能有效地在这些应用中使用。

很久以前诸如PovRay这样的绘图工具就已经使用CSG进行图像建模了。尽管这种绘图工具的互动建模工具包恰恰忽略CSG命令,但OpenCSG代表了这种应用软件的一种有价值的附加品。

总的来说,到目前为止CSG渲染已经几乎没有再用于交互式应用程序,因为所需的算法复杂且容易出错。我们希望通过提供一个免费的库,这个库是易于使用、快速灵活的,这将使它比目前更为主流。

先决条件:

OpenCSG的库要求在OpenGL中也支持PBuffer或帧缓冲对象的图形硬件。在PBuffers条件下,如果渲染到纹理的相关设备也被支持这将是有利的,如今OpenCSG使用RenderTexture类作为PBuffer库。

一直以来,PBuffers已被广泛支持。NVidia至少自 Radeon 系列就开始支持PBuffers,随后是Riva TNT 和 ATI;其他供应商生产的图形硬件似乎并不支持PBuffers。因此,如果您不熟悉图形硬件并且运气较差的话可能就无法使用OpenCSG来运行程序。 在Linux条件下,您可能需要选择同时支持OpenGL软件渲染与PBuffers。

帧缓冲对象是OpenGL的一个较新的扩展。它们更易于用作开发,现在(2010年)已经成熟。它们也是OpenGL3.0的一部分、从1.2.0OpenCSG开始在默认情况下使用OpenCSG,在较旧的版本中默认使用PBuffers。

对于OpenGL扩展检查,OpenCSG使用OpenGL扩展甲等库GLEW。

OpenCSG写在c++中,使用命名空间,并需要STL。在Windows下我不希望主要编 译器不兼容。MSVC6, VC2003 .net和Dev-C++ 5 beta都提供相应的工作区。在Linux环境下,您应该使用gcc3或者更高版本。由于该编译器并不能处理必须在内部使用的std::map实现,致使 gcc 2.95.x不再有效。

要运行好OpenCSG,您应该有高填充率的图形硬件。NVidia 图形硬件自从 GeForce 和 ATI Radeon 以后满足了以上要求。在OpenCSG::OcclusionQuery选项显然需要封闭查询,这个选项功能是从Radeon 9x00(x>= 5)和GeForce3(注意,GeForce4MX的数量为GeForce2!)显卡芯片出现以后才开始支持的。

OpenCSG 已成功地在英特尔和AMD的硬件上使用 Radeon HD 4670、 GeForce 8 x 00、GeForceFX 6800、5600 GeForceFX,Radeon 9700、 GeForce3、GeForce4MX 和 TNT2图形硬件运行(越往后越慢)。

在Radeon9000上,OpenCSG会在除了标准Goldfeather渲染路径以外的其他任何地方产生渲染错误,这一情况曾广为人知,这是否是驱动器的问题并不很清楚。我没有在NVidia或ATI/AMD以外的图形硬件上运行OpenCSG的经验。

使用情况:

OpenCSG的接口非常容易使用。只有一个叫做OpenCSG::Primitive的抽象类。A基元对象包含一个表示是附加还是求差的属性操作。使用OpenCSG可以通过执行render()方法来创建一个派生自具体基元的类。

如今实现CSG渲染,有一个将std::vector<Primitive*> 作为参数的函数OpenCSG::render()。渲染函数求由基元组得出的CSG表达式的值并使用CSG的固有值来初始化深度缓冲区。颜色缓冲区仍然 没有改变,此后您必须使用一个以GL_EQUAL为参数的深度函数来隐藏数组中的基元。

浏览 17
点赞
评论
收藏
分享

手机扫一扫分享

编辑 分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

编辑 分享
举报