OpenGL相对深度缓冲区的片段

3

我理解使用

glDepthFunc(GL_LESS); 

使对象在相机更近时呈现在任何对象的顶部。
我想知道是否有任何方法修改这样的深度函数,以便我可以进行灵活的渲染。
更具体地说,假设有9个不同的面,A1、A2、A3、B1、B2、B3、C1、C2、C3。
我想要做的是,当渲染时,A1、A2、A3被正确渲染。(更靠近相机的在顶部呈现。)B和C也是如此。
然而,无论到相机的距离如何,B总是呈现在A的顶部,C呈现在B的顶部,但A呈现在C的顶部。即A
这是可能的吗?
编辑:
我的想法是为“不真实的图形”生成一个3D模型。虽然可能有其他方法实现这一点,但我在这里想知道是否有一种通过修改深度函数工作方式来解决的方法。

enter image description here


我无法理解 A<B<C<A 这个表达式。你能发一张图片吗? - Ripi2
1个回答

1
首先,需要注意深度测试与单个像素有关,而非对象。
其次,您可以清除深度缓冲区,同时保留颜色缓冲区。例如,如果您希望绘制两组基元,并且希望第二组在第一组的上方,则可以执行以下操作:
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
glDrawArrays(...) // draw the first group
glClear(GL_DEPTH_BUFFER_BIT)
glDrawArrays(...) // draw the second group

每个组将会对自身进行深度测试,但不会与其他组进行比较。通过这种方式,您可以实现分层渲染策略。

谢谢您的周到回复!我对OpenGL真的很陌生。我知道我可以画A < B < C,但是如何画一个在A下面的C呢? - dobeedobeee
我认为我们需要一张图片,因为有些东西很难理解。 :) - prideout
我已经添加了一张图片!感谢您的帮助。 - dobeedobeee
哈!或许Monument Valley(Ustwo Games)的开发者可以提供帮助!我认为你可以通过正交投影和仔细将场景分成层来实现这一点。 - prideout
是的,我的当前尝试正是如此,但我希望相机角度可以更自由一些,这样物体可以在每个方向上转动大约30度,而不是固定在一个位置。 - dobeedobeee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接