Opengl es OpenGL ES中AR覆盖效果的自定义绘图顺序(10)

Opengl es OpenGL ES中AR覆盖效果的自定义绘图顺序(10),opengl-es,augmented-reality,stencil-buffer,zbuffer,Opengl Es,Augmented Reality,Stencil Buffer,Zbuffer,我正在开发一个增强现实应用程序,需要对三种不同几何体的渲染进行排序 一级 背景几何。这是一组表示基本架构的三角形。墙壁等 第2级 摄影飞机。作为纹理放置在空间平面上的建筑照片。该平面几何上位于Level 1的前面(从虚拟摄影机中可以看到) 三级 动态几何。这些是基本体,如长方体等,用于增强场景。它们在几何上位于标高2之后,因为它们正确放置在标高1的坐标系内 理想效果: a) 我希望级别2始终绘制在级别1的前面 这是通过将图像平面靠近摄影机自动实现的 b) 我希望将标高3与标高1正确遮挡,从而隐藏

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

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

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

三级
动态几何。这些是基本体,如长方体等,用于增强场景。它们在几何上位于标高2之后,因为它们正确放置在标高1的坐标系内

理想效果:
a) 我希望级别2始终绘制在级别1的前面 这是通过将图像平面靠近摄影机自动实现的

b) 我希望将标高3与标高1正确遮挡,从而隐藏动态长方体的部分,如果它部分放置在标高1的墙后面。 正常管道也会自动发生这种情况。深度测试等

c) 我希望级别_3的所有片段/像素都绘制在级别_2之上,即使它们实际上在级别_2后面。效果应该使对象出现,就像它们被照片的某些部分遮挡一样

我知道这是可能的,因为我在X3Dom中有一个应用程序(渲染到webgl),它可以通过“sortkey”属性实现这种效果。 但我无法在纯OpenGL中重现相同的效果。 我认为这应该是一个简单的使用Stencilbuffer或Z-Buffer技巧,但我没有让它工作。 如何为标高_3几何体提供“始终通过”,使其在所有其他几何体之上绘制,但也正确地遮挡标高_1? 或者,如何使Level_2仅隐藏Level_1而不隐藏Level_3,即使它位于两者前面

基本上:
1) 级别2隐藏级别1
2) _1级和_3级相互咬合
3) 标高_3(相对于标高_1)的可见部分未被标高_2遮挡

有什么帮助吗


谢谢

您需要根据所描述的级别分三个阶段渲染场景。应首先在启用深度测试的情况下渲染级别_1。然后,应使用禁用的深度测试渲染级别_2。在第三阶段,您应该在启用深度测试的情况下渲染级别3。因此,级别2的几何体将被渲染为完全重叠的级别2,同时不会影响z缓冲区,因此级别3的几何体将被渲染为级别2根本没有被渲染

要启用和禁用深度测试,应调用函数。 调用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         
    */

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

gl.glDepthMask(假)

gl.glDepthMask(真)


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

这不起作用。如果禁用深度测试,则不允许正确渲染几何体。它创建“所有面都相等”无遮挡效果,但不创建所需的覆盖。