基于图像CSG的库 OpenCSG 1.3.2 发布
openkk 13年前
<div id="p_fullcontent" class="detail"> <p>OpenCSG是一个基于图像CSG的库,CSG使用OpenGL渲染。OpenCSG使用c++编写,并支持Microsoft Windows或Linux操作系统下最先进的图形硬件。</p> <p>什么是CSG呢?CSG是Constructive Solid Geometry(构造实体几何)的缩写,它使用简单的3D图形来构造复杂图形。也就是说,通过附加或求差的方法可以进行图形的组合,那些不是由CSG操 作产生的最基本的图形称之为primitives(基元),基元必须是实体,即基元必须要有明确的内部或者外部定义。通过构建,一个CSG也一定是实体。</p> <p>基于图像的CSG渲染(深度缓冲区CSG渲染)是一个专用名词,它为几何边界未经过明确计算的 CSG形状指定渲染算法,这种算法使用图形硬件的帧缓冲区设置,如深度缓存或模板缓存,来构建CSG形状。OpenCSG实现多种算法结合,其中就有 goldfeather算法和SCS算法。</p> <p>优点:</p> <p>CSG是经常被用作在CAD/CAM应用程序中的基本建模技术。这里,基于图像的CSG是交互操作CSG形状的关键。由于OpenCSG对更复杂的图像渲染较为快速,所以它能有效地在这些应用中使用。</p> <p>很久以前诸如PovRay这样的绘图工具就已经使用CSG进行图像建模了。尽管这种绘图工具的互动建模工具包恰恰忽略CSG命令,但OpenCSG代表了这种应用软件的一种有价值的附加品。</p> <p>总的来说,到目前为止CSG渲染已经几乎没有再用于交互式应用程序,因为所需的算法复杂且容易出错。我们希望通过提供一个免费的库,这个库是易于使用、快速灵活的,这将使它比目前更为主流。</p> <p>先决条件:</p> <p>OpenCSG的库要求在OpenGL中也支持PBuffer或帧缓冲对象的图形硬件。在PBuffers条件下,如果渲染到纹理的相关设备也被支持这将是有利的,如今OpenCSG使用RenderTexture类作为PBuffer库。</p> <p>一直以来,PBuffers已被广泛支持。NVidia至少自 Radeon 系列就开始支持PBuffers,随后是Riva TNT 和 ATI;其他供应商生产的图形硬件似乎并不支持PBuffers。因此,如果您不熟悉图形硬件并且运气较差的话可能就无法使用OpenCSG来运行程序。 在Linux条件下,您可能需要选择同时支持OpenGL软件渲染与PBuffers。</p> <p>帧缓冲对象是OpenGL的一个较新的扩展。它们更易于用作开发,现在(2010年)已经成熟。它们也是OpenGL3.0的一部分、从1.2.0OpenCSG开始在默认情况下使用OpenCSG,在较旧的版本中默认使用PBuffers。</p> <p>对于OpenGL扩展检查,OpenCSG使用OpenGL扩展甲等库GLEW。</p> <p>OpenCSG写在c++中,使用命名空间,并需要STL。在Windows下我不希望主要编 译器不兼容。MSVC6, VC2003 .net和Dev-C++ 5 beta都提供相应的工作区。在Linux环境下,您应该使用gcc3或者更高版本。由于该编译器并不能处理必须在内部使用的std::map实现,致使 gcc 2.95.x不再有效。</p> <p>要运行好OpenCSG,您应该有高填充率的图形硬件。NVidia 图形硬件自从 GeForce 和 ATI Radeon 以后满足了以上要求。在OpenCSG::OcclusionQuery选项显然需要封闭查询,这个选项功能是从Radeon 9x00(x>= 5)和GeForce3(注意,GeForce4MX的数量为GeForce2!)显卡芯片出现以后才开始支持的。</p> <p>OpenCSG 已成功地在英特尔和AMD的硬件上使用 Radeon HD 4670、 GeForce 8 x 00、GeForceFX 6800、5600 GeForceFX,Radeon 9700、 GeForce3、GeForce4MX 和 TNT2图形硬件运行(越往后越慢)。</p> <p>在Radeon9000上,OpenCSG会在除了标准Goldfeather渲染路径以外的其他任何地方产生渲染错误,这一情况曾广为人知,这是否是驱动器的问题并不很清楚。我没有在NVidia或ATI/AMD以外的图形硬件上运行OpenCSG的经验。</p> <p>使用情况:</p> <p>OpenCSG的接口非常容易使用。只有一个叫做OpenCSG::Primitive的抽象类。A基元对象包含一个表示是附加还是求差的属性操作。使用OpenCSG可以通过执行render()方法来创建一个派生自具体基元的类。</p> <p>如今实现CSG渲染,有一个将std::vector<Primitive*> 作为参数的函数OpenCSG::render()。渲染函数求由基元组得出的CSG表达式的值并使用CSG的固有值来初始化深度缓冲区。颜色缓冲区仍然 没有改变,此后您必须使用一个以GL_EQUAL为参数的深度函数来隐藏数组中的基元。</p> </div> <br /> <br /> <span style="font-weight:bold;">OpenCSG 1.3.2 发布了,这是一个维护版本,修复了大量关于渲染方面的问题。<br /> <br /> 项目地址:<a href="/misc/goto?guid=4958202699868805552" target="_blank">http://www.opencsg.org/</a></span>