14

默认情况下,对象似乎是从前到后绘制的。我正在绘制一个 2-D UI 对象,并希望从前创建它。例如,我可以先创建一个白色方块,然后在其顶部创建一个稍小的黑色方块,从而创建一个带有白色边框的黑色窗格。 这篇文章对此进行了一些讨论,并将此顺序描述为“画家算法”,但最终他们给出的示例只是简单地以相反的顺序渲染对象以获得所需的效果。我想从前到后(第一个对象在后面,后续对象在顶部绘制)渲染可以通过一些转换来实现(gOrtho?)?

我还会提到,我对使用 GLUT 等包装库的解决方案不感兴趣。

我还发现,使用 Cocoa NSOpenGLView 在 Mac 上的默认行为似乎会向后拉,而在 Windows 中我无法获得这种行为。我正在使用的 Windows 中的设置代码是这样的:

glViewport (0, 0, wd, ht);
glMatrixMode(GL_PROJECTION);           
glLoadIdentity();                      
glOrtho (0.0f, wd, ht, 0.0f, -1.0f, 1.0f);
glMatrixMode(GL_MODELVIEW);             
glLoadIdentity();                       
4

6 回答 6

24

以下调用将关闭深度测试,导致对象按创建的顺序绘制。这实际上会导致对象向后拉到前面。

glDepthFunc(GL_NEVER);      // Ignore depth values (Z) to cause drawing bottom to top

确保你不要这样称呼:

glEnable (GL_DEPTH_TEST);   // Enables Depth Testing
于 2008-10-10T02:28:34.640 回答
5

对于您的具体问题,没有在 OpenGL 中指定深度排序的标准化方法。默认情况下,某些实现可能会进行从前到后的深度排序,因为它通常更快,但这不能保证(正如您所发现的那样)。

但我真的不明白它会如何在你的场景中帮助你。如果你在一个白色方块前面画一个黑色方块,只要你启用了深度缓冲,黑色方块就应该画在白色方块前面,不管它们的绘制顺序是什么。如果它们实际上是共面的,那么任何一个都不会真正在另一个之前,并且任何深度排序算法都是不可预测的。

您发布链接的教程仅讨论了它,因为当您使用透明度时,深度排序是相关的。但在我看来,这并不是你所追求的。

但是,如果您真的必须这样做,那么您必须自己做。首先将您的白色方块发送到渲染管道,强制渲染,然后发送您的黑色方块。如果你这样做,并禁用深度缓冲,那么方块可以是共面的,你仍然可以保证黑色方块被绘制在白色方块上。

于 2008-10-09T01:40:28.293 回答
2

绘图顺序很难。没有简单的解决方案。画家的算法(按对象相对于相机视野的距离对对象进行排序)是最直接的,但正如您所发现的,它并不能解决所有情况。

我建议将画家的算法和图层结合起来。您为程序中的特定元素构建层。这样你就有了背景层、对象层、特效层和 GUI 层。

对每一层的项目使用画家算法。在某些特殊层(如您的 GUI 层)中,不要使用画家算法进行排序,而是按照您的调用顺序进行排序。你首先调用那个白色方块,所以它首先被绘制。

于 2008-10-09T01:04:23.780 回答
2

将您想要放在后面的物品画在您想要放在前面的物品后面。也就是实际改变z值(假设z垂直于屏幕平面)。您无需进行太多更改即可让项目在彼此面前绘制。如果你只是稍微改变 z 值,你应该不会注意到与他们想要的位置有太大的偏移。您甚至可以非常花哨,并根据更改的 z 位置计算正确的 x,y 位置,以便项目出现在它应该在的位置。

于 2008-10-09T01:08:39.230 回答
1

你的东西将按照你调用 glBegin/glEnd 函数的确切顺序绘制。你可以使用 z-buffer 获得深度缓冲,如果你的 2d 对象有不同的 z 值,你可以得到你想要的效果。您在 Mac 上看到您描述的行为的唯一方法是程序是否手动以从后到前的顺序绘制内容或使用 z 缓冲区来完成此操作。否则,OpenGL 没有您所描述的任何自动功能。

于 2008-10-10T02:40:12.963 回答
0

正如 AlanKley 指出的那样,这样做的方法是禁用深度缓冲区。画家算法实际上是一种 2D 扫描转换技术,用于在没有 z 缓冲区之类的东西时以正确的顺序渲染多边形。但您不会将其应用于 3D 多边形。您通常会转换和投影它们(处理与其他多边形的交点),然后按投影的 z 坐标对生成的 2D 投影多边形列表进行排序,然后以反向 z 顺序绘制它们。

当您不能(或不想)使用 z 缓冲区时,我一直认为画家算法是一种替代隐藏表面移除的技术。

于 2008-10-10T02:38:24.120 回答