2011-09-05 89 views
-1

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

也许我失去了一些东西,但我找不到任何与完全不透明的网格物体(具有不透明表面的空心物体)或空心几何体相比讨论简单的,非不透明的固体(固体=填充几何体)透明表面。

+0

你的形状有什么属性?是否安全地假设它虽然可能是凸的,但它不是自相交的,并且多边形中描述的边界是完全密封的? – Tommy

+0

@Tommy这实际上有点可怕。对象是人类的大脑。顶点来自某种医疗设备。其目的是检测各层大脑,并通过前层显示更深层的图层[你并不孤单,我也不太了解它;-)]。 –

+0

所以最初是一个体素类型的东西,根本没有多边形几何? – Tommy

回答

1

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

由于写入着色器程序成为可能,所以解决这个问题的各种方法已经成为可能,最明显的是你的目的是光线投射。您可以将立方体上载为几何体,将其设置为渲染背面而不是正面,并将体素中的实际对象形成为3D纹理贴图。在着色器中,对于每个像素,您将从3D纹理中的一个位置开始,获取朝向相机的矢量,并以适当的时间间隔向前走再取样。

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

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

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

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

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