0

我正在开发一个增强现实应用程序,需要对三种不同几何图形的渲染进行排序。

级别 1
背景几何。这是一组代表基本架构的三角形。墙壁等

2 级
照片平面。作为纹理放置在空间平面上的建筑照片。该平面在几何上位于 1 级前面(从虚拟相机中看到)

3 级
动态几何。这些是诸如盒子之类的基元,用于增强场景。它们在几何上落后于 Level 2,因为它们正确地放置在 Level 1 的坐标系内

期望的效果:
a) 我希望 Level_2 始终绘制在 Level_1 的前面 这是通过将图像平面放置在更靠近相机的位置来自动实现的。

b) 我希望 Level_3 被 Level_1 正确遮挡,从而隐藏动态框的一部分,如果它部分放置在 Level_1 的墙后面。这也会自动发生在普通管道中。深度测试等

c) 我希望 Level_3 的所有片段/像素都绘制在 Level_2 之上,即使它们实际上在它后面。效果应该使对象看起来好像它们被照片的某些部分遮挡了。

我知道这是可能的,因为我在 X3Dom 中有一个应用程序(它呈现给 webgl),它可以通过“sortkey”属性实现这种效果。但我无法在纯 OpenGL 中重新创建相同的效果。我认为这应该是对 Stencilbuffer 或 Z-Buffer 技巧的简单使用,但我没有让它工作。我如何给 Level_3 几何体一个“总是通过”,以便它被绘制在其他所有东西之上,但也正确地被 Level_1 遮挡?或者我如何让 Level_2 只隐藏 Level_1 而不是 Level_3,即使它在两者前面?

基本上:
1) Level_2 隐藏 Level_1
2) Level_1 和 Level_3 相互遮挡
3) Level_3 的可见部分(相对于 Level_1)不被 Level_2 遮挡

有什么帮助吗?

谢谢!

4

2 回答 2

0

过了一会才发现,这里忘记更新了。解决方案和预期的一样简单。深度测试始终保持活跃。渲染按 1、2、3 顺序调用。2 级渲染包含在

gl.glDepthMask(假);

gl.glDepthMask(true);

允许对每个级别进行正确的深度渲染和遮挡,但不会更改渲染级别 2 元素的深度缓冲区。因此,级别 3 的元素会忽略级别 2 的深度并针对级别 1 进行裁剪。

于 2014-05-26T18:44:26.423 回答
0

您需要根据您描述的级别分三个阶段渲染场景。level_1 应该首先在启用深度测试的情况下渲染。然后,您应该使用禁用的深度测试来渲染 level_2。在第三阶段,您应该启用深度测试来渲染 level_3。因此,level_2 的几何图形将被渲染为与 level_2 完全重叠,同时它不会影响 z-buffer,因此 level_3 的几何图形将被渲染,就好像 level_2 根本没有被渲染一样。

要启用和禁用深度测试,您应该调用glEnable 和 glDisable函数。调用glDisable(GL_DEPTH_TEST)将禁用深度测试和深度缓冲区的更新。要启用深度测试并写入深度缓冲区,您应该调用glEnable(GL_DEPTH_TEST)

您需要执行的一般步骤:

    /*
    Render level_1 
    */

    glDisable(GL_DEPTH_TEST); //disable depth test and update of the depth buffer

    /*
    Render level_2         
    */

    glEnable(GL_DEPTH_TEST);  //enable depth test and update of the depth buffer

    /*
    Render level_3         
    */
于 2014-05-14T21:03:11.690 回答