我正在研究一个增强现实应用程序,需要对三种不同几何图形的绘制进行排序。
1级
背景几何。这是一组代表基本架构的三角形。墙壁等
2级
摄影飞机。一张建筑的照片,作为空间平面上的纹理。那架飞机在第一层的前面是几何的(从虚拟相机上可以看到)
3级
动态几何这些都是原语,如盒子等,以扩大场景。它们在二级后几何位置,因为它们被正确地放置在1级的坐标系中。
预期效果:
我希望Level_2总是被画在Level_1前面,这是通过将图像平面靠近相机来自动实现的。
( b)我希望Level_3对Level_1正确地被遮挡,从而隐藏动态盒的一部分,如果它被部分放置在Level_1墙后面,这在正常的管道中也会自动发生。深度测试等
( c)我希望Level_3的所有片段/像素都绘制在Level_2之上,即使它们实际上在后面。这种效果应该会使物体出现,就好像它们被照片的部分遮住了一样。
我知道这是可能的,因为我在X3Dom中有一个应用程序(它呈现给webgl),它可以通过"sortkey“属性实现这一效果。但我无法在纯OpenGL中重现同样的效果。我认为这应该是Stencilbuffer或Z缓冲区技巧的简单使用,但我无法让它发挥作用。我如何将“始终传递”给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遮挡。
有什么帮助吗?
谢谢!
发布于 2014-05-26 18:44:26
一段时间后发现了,但忘了在这里更新。解决办法如预期的那样简单。DepthTesting始终保持活动状态。呈现按1,2,3的顺序调用。2级的呈现包含在
Gl.glDepthMask(假);
Gl.glDepthMask(真);
允许对每个级别进行正确的深度渲染和遮挡,但不会从呈现级别2元素中更改深度缓冲区。因此,第3级元素忽略了级别2的深度,而忽略了针对级别1的剪辑。
发布于 2014-05-14 21:03:11
您需要在三个阶段渲染场景相应地达到您所描述的级别。在启用深度测试的情况下,应该首先呈现level_1。然后,您应该使用禁用的深度测试来呈现level_2。在第三阶段,您应该在启用深度测试的情况下呈现level_3。因此,level_2的几何形状将呈现完全重叠的level_2,同时它不会影响z-缓冲区,因此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
*/https://stackoverflow.com/questions/23630540
复制相似问题