我正在开发一个增强现实应用程序,需要对三种不同几何形状的渲染进行排序。
1级几何背景。这是一组代表基本建筑的三角形。墙等等。
2级平面照片。将建筑作为纹理放置在空间平面上的照片。该平面几何上位于第1层的前方(从虚拟摄像机中看到)
三级
动态几何。这些是像盒子之类的原语,用来增强场景。它们在几何上落后于第2级,因为它们被正确地放置在第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遮挡
帮忙吗?
谢谢!
你需要根据你所描述的关卡分三个阶段渲染场景。应该首先渲染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
*/
过了一段时间才发现,但忘了在这里更新。解决方案和预期的一样简单。DepthTesting一直处于活动状态。渲染按1、2、3的顺序调用。第2级渲染包含在
中gl.glDepthMask(假);
gl.glDepthMask(真正);
允许正确的深度渲染和遮蔽每个级别,但不会改变渲染级别2元素的深度缓冲。因此,第3级元素忽略了第2级元素的深度,并对第1级元素进行剪辑。