使用 WebGL 的多尺度巨大 3D 体积渲染
Multi-scale huge 3D volume rendering using WebGL
我正在使用 WebGL 渲染一个巨大的 3D 体积,光线投射算法是在着色器 (glsl) 中实现的。该卷是从生物图像堆栈创建的。我想要做的是在渲染这个 3D 体积时保持平滑地放大和缩小。但是图像堆栈是高分辨率的,为了获得实时性能,我需要使用 Octree。你对我如何实施它有什么建议吗?
我认为仅使用 WebGL 无法在 GPU 上获得八叉树 - 它仅支持 OpenGL ES 2.0,因此实现一些像样的八叉树可能太少了。
不过,有些技巧可能有助于解决您的问题。一般来说,您希望在 zooming/movement 期间加快渲染速度,但尽可能保持目标质量。
您可以实现一些 'low def' 质量并在相机移动期间使用它。最简单的就是使用更大的光线投射步骤,您也可以准备一些分辨率较低的图像版本。
然后,当您看到该用户开始 move/zoom 视图时,您可以打开 'low def' 渲染以获得更高的 fps。在此移动过程中,用户不会注意到移动图像的质量有太大损失,当他停止更换相机时,您会再次渲染场景 - 但会达到您的目标质量。
假设您的典型渲染需要 1 秒,而 'low def' 需要 0.1 秒。使用这种方法,您可以获得约 10fps 的交互式相机移动,当您停止移动时,您将在 1 秒后获得最终图像。
我知道这并不理想,但可能会很好地为您服务,我看到很少有更大的 gfx 应用程序使用该技巧。
一些略有不同但相似的方法是在交互移动期间渲染每 X 个像素之一。在某些 3D 建模应用程序中,当您更改 view/move 某些对象并启用光线跟踪预览时,您可能会注意到它只渲染了所有像素的一部分,从而保持了交互性。当您停止移动时,它会渲染其余像素。
我正在使用 WebGL 渲染一个巨大的 3D 体积,光线投射算法是在着色器 (glsl) 中实现的。该卷是从生物图像堆栈创建的。我想要做的是在渲染这个 3D 体积时保持平滑地放大和缩小。但是图像堆栈是高分辨率的,为了获得实时性能,我需要使用 Octree。你对我如何实施它有什么建议吗?
我认为仅使用 WebGL 无法在 GPU 上获得八叉树 - 它仅支持 OpenGL ES 2.0,因此实现一些像样的八叉树可能太少了。
不过,有些技巧可能有助于解决您的问题。一般来说,您希望在 zooming/movement 期间加快渲染速度,但尽可能保持目标质量。 您可以实现一些 'low def' 质量并在相机移动期间使用它。最简单的就是使用更大的光线投射步骤,您也可以准备一些分辨率较低的图像版本。
然后,当您看到该用户开始 move/zoom 视图时,您可以打开 'low def' 渲染以获得更高的 fps。在此移动过程中,用户不会注意到移动图像的质量有太大损失,当他停止更换相机时,您会再次渲染场景 - 但会达到您的目标质量。
假设您的典型渲染需要 1 秒,而 'low def' 需要 0.1 秒。使用这种方法,您可以获得约 10fps 的交互式相机移动,当您停止移动时,您将在 1 秒后获得最终图像。
我知道这并不理想,但可能会很好地为您服务,我看到很少有更大的 gfx 应用程序使用该技巧。
一些略有不同但相似的方法是在交互移动期间渲染每 X 个像素之一。在某些 3D 建模应用程序中,当您更改 view/move 某些对象并启用光线跟踪预览时,您可能会注意到它只渲染了所有像素的一部分,从而保持了交互性。当您停止移动时,它会渲染其余像素。