【问题标题】:Custom drawing order for AR overlay effects in OpenGL ES (10)OpenGL ES中AR叠加效果的自定义绘制顺序(10)
【发布时间】:2014-07-01 02:02:42
【问题描述】:

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

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

2级
拍照飞机。作为纹理放置在空间平面上的建筑照片。该平面在几何上位于 Level 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 遮挡

有什么帮助吗?

谢谢!

【问题讨论】:

    标签: opengl-es augmented-reality stencil-buffer zbuffer


    【解决方案1】:

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

    要启用和禁用深度测试,您应该调用glEnable and 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         
        */
    

    【讨论】:

    • 这不起作用。如果禁用深度测试,则不允许正确渲染几何。它创建了“所有面都相等”的无遮挡效果,但不是所需的叠加层。
    【解决方案2】:

    一段时间后发现,但忘记在这里更新。 解决方案和预期的一样简单。 深度测试始终保持活跃。渲染按顺序 1、2、3 调用。 第 2 层的渲染包含在

    gl.glDepthMask(false);

    gl.glDepthMask(true);

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多