Opengl 渲染顺序
Opengl Render Order
我有一个 Opengl 应用程序,它按模型渲染场景模型。
如果,比方说,我先在前面渲染一个模型,然后在后面渲染一个模型,后面的模型是否会被绘制到前面模型顶部的显示器上?
OpenGL 完全按照您发出命令的顺序处理所有命令。这意味着如果你画一个前面的模型,然后在后面画一个模型,第二个模型会默认透支第一个。
如果你想只绘制实际在前面的部分,你必须启用depth testing(glEnable(GL_DEPTH_TEST);
)。这确保只有比已存储的像素更靠近查看器的像素才会写入后台缓冲区。请注意,此方法仅适用于非透明对象。
这取决于您是否启用了深度测试。如果启用深度测试*,那么绘制对象的顺序与最终显示的场景无关**。因此,只要在您的 setup_gl
或您用于初始化场景的任何函数中,在绘图发生之前,您已经调用了 glEnable(GL_DEPTH_TEST);
,您就不必考虑顺序。
* 并且您没有使用 glDepthFunc
或某些类似函数更改 深度测试函数 。如果你有,(这通常只推荐给需要特殊功能的人,所以对你来说,你不应该),深度测试将表现出不同的行为。
** ... 除非您使用透明对象,在这种情况下,您要么需要在着色器中实现一个 [昂贵的] 与顺序无关的透明算法, 或绘制顺序 WILL 很重要(通常,为了透明,您需要从后到前绘制)。
我有一个 Opengl 应用程序,它按模型渲染场景模型。
如果,比方说,我先在前面渲染一个模型,然后在后面渲染一个模型,后面的模型是否会被绘制到前面模型顶部的显示器上?
OpenGL 完全按照您发出命令的顺序处理所有命令。这意味着如果你画一个前面的模型,然后在后面画一个模型,第二个模型会默认透支第一个。
如果你想只绘制实际在前面的部分,你必须启用depth testing(glEnable(GL_DEPTH_TEST);
)。这确保只有比已存储的像素更靠近查看器的像素才会写入后台缓冲区。请注意,此方法仅适用于非透明对象。
这取决于您是否启用了深度测试。如果启用深度测试*,那么绘制对象的顺序与最终显示的场景无关**。因此,只要在您的 setup_gl
或您用于初始化场景的任何函数中,在绘图发生之前,您已经调用了 glEnable(GL_DEPTH_TEST);
,您就不必考虑顺序。
* 并且您没有使用 glDepthFunc
或某些类似函数更改 深度测试函数 。如果你有,(这通常只推荐给需要特殊功能的人,所以对你来说,你不应该),深度测试将表现出不同的行为。
** ... 除非您使用透明对象,在这种情况下,您要么需要在着色器中实现一个 [昂贵的] 与顺序无关的透明算法, 或绘制顺序 WILL 很重要(通常,为了透明,您需要从后到前绘制)。