OpenGL半透明固体,没有折射?

时间:2011-09-05 07:27:53

标签: opengl

我想渲染一个半透明的实体对象,但我不想让自己参与折射。我想要这个(希望)相当简单的效果:对象越厚,它变得越不透明,它背后的对象就越模糊;但是(再次)我不想让自己参与折射或任何复杂的光物质相互作用。

也许我错过了一些东西,但我找不到任何讨论简单,不透明的实体(实心=填充几何体)的良好来源,而不是完全不透明的网格(具有不透明表面的空心物体)或透明的空心几何体表面。

1 个答案:

答案 0 :(得分:1)

OpenGL是一个前向渲染器,可以将它可以栅格化的对象限制为点,线和多边形。起点是所有3d形状都是从那些两个或更少的维度基元构建的。 OpenGL本身并不具有实体,填充三维几何的概念,因此没有内置概念,即特定片段在概念上运行的对象有多远,只有它进入或退出的次数。

由于可以编写着色器程序,因此可以通过各种方式解决问题,最明显的就是光线投射。您可以将多维数据集上传为几何图形,设置为渲染背面而不是前面,并将您的实际对象以体素形式上传为3d纹理贴图。在着色器中,对于每个像素,您将从3d纹理中的一个位置开始,向相机获取一个向量,并以适当的间隔向前重新取样。

更快,更容易调试的解决方案是构建对象的BSP树,以便将其分解为可以按照前面顺序绘制的凸面部分。准备两个深度缓冲区和一个像素缓冲区。为清楚起见,将深度缓冲区调用后缓冲区,另一个调用前缓冲区。

您将沿着模型的凸起部分从后向前移动,在渲染到后深度缓冲区之间交替,没有颜色输出,并使用颜色输出写入前深度缓冲区。你可以在软件渲染器中只使用一个,但是由于各种管道原因,OpenGL不允许读取目标缓冲区。

对于每个凸面部分,首先渲染背面多边形到后面的缓冲区。然后将前置多边形渲染到前缓冲区和颜色缓冲区。编写一个着色器,以便输出的每个像素计算其不透明度,作为其深度与后缓冲区中存储位置的深度之间的差异。

如果您担心相机与模型相交,您还可以将前置多边形渲染到后缓冲区(在将它们渲染到前缓冲区后立即切换目标将是最方便的),然后在最后在前平面绘制一个全屏多边形,输出一个合适的alpha值,后面缓冲区的值与前缓冲区的值不同。

另外:如果源数据是某种体素数据,如CT或MRI扫描仪,那么光线投射的替代方法是上传为3d纹理并绘制一系列切片(如果垂直于视图平面,则可能,沿着当前的主轴,否则)。您可以在Nvidia's Developer Zone看到一些文档和演示。