当前位置:  开发笔记 > 编程语言 > 正文

在openGL中,如何让项目回到前面?

如何解决《在openGL中,如何让项目回到前面?》经验,为你挑选了2个好方法。

默认情况下,似乎从前到后绘制对象.我正在绘制一个二维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();                       

AlanKley.. 24

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

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

请务必不要这样称呼:

glEnable (GL_DEPTH_TEST);   // Enables Depth Testing


Gerald.. 5

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

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

您发布链接的教程只讨论过它,因为当您使用透明度时,深度排序是相关的.但这对你来说听起来并不像你所追求的那样.

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



1> AlanKley..:

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

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

请务必不要这样称呼:

glEnable (GL_DEPTH_TEST);   // Enables Depth Testing



2> Gerald..:

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

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

您发布链接的教程只讨论过它,因为当您使用透明度时,深度排序是相关的.但这对你来说听起来并不像你所追求的那样.

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

推荐阅读
k78283381
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有