【问题标题】:How can I render multiple draw modes?如何渲染多种绘制模式?
【发布时间】:2015-02-24 21:52:07
【问题描述】:

我创建了一个切换绘图模式(GL_TRIANGLES、GL_POINTS、GL_LINE_LOOP 等)的程序。我使用 glDrawArarys() 渲染这些绘图模式,但每次我切换到新的绘图模式时,它都会将我在之前的绘图模式中创建的所有点设置为新的绘图模式。

我想断开这些点,这样我就可以在同一个渲染中拥有 2 种不同绘制模式的形状。我该怎么做?

下面是问题。切换到新的绘图模式后,我的 GL_TRIANGLE_STRIP 点变为 GL_TRIANGLE_STRIP 点。

【问题讨论】:

  • 您可能想发布一小段渲染代码,以便我们了解您当前正在做什么,以帮助确定需要更改的内容。

标签: qt opengl


【解决方案1】:

你需要画两次。第一个带有GL_TRIANGLES 原语,第二个带有GL_TRIANGLE_STRIP 原语。像这样的:

glDrawArrays(GL_TRIANGLES, first, count);

// do any atualization in Uniforms, if necessary to update transformations
// and do it again
glDrawArrays(GL_TRIANGLE_STRIP, first, count);

【讨论】:

  • 这在短期内确实有效,但是当我想回到绘制 GL_TRIANGLES 时会发生什么?我是否必须保留一个单独的 int 数组,其中包含每个绘制模式开始位置的索引?
  • @tim:OpenGL 不是场景图。你告诉它画一些东西,画了一些东西,就是这样。 OpenGL 不会保留场景。无论你想看到什么,你都必须逐字告诉它 OpenGL。没有“添加到场景”或“更新”之类的东西。您总是从头开始绘制整个帧。
  • @datenwolf:所以没有绘图功能可以只更新场景或分离点而无需指定绘图模式的结束位置?
  • @tim:如果没有看到你目前尝试过的代码,真的很难判断。
【解决方案2】:

您始终可以将此问题抽象为您的一组形状。

如果您正在绘制的每个形状都是一个对象,您可以轻松地做到这一点。您可以创建一个形状类来存储一组点并设置您的 VBO,然后该类可以包含 render() 方法。

你的形状类可以存储一个GLenum drawMode,它是那个形状的绘制模式的句柄。然后,无需编写所有绘制代码​​并将其复制到您的 glRenderLoop() 中,您可以将其编写在 render() 方法中,然后在 glRenderLoop() 中调用您的形状的渲染方法。

render() 方法随后将根据您创建形状的方式使用适用的绘制模式。

【讨论】:

    猜你喜欢
    • 2011-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-16
    • 1970-01-01
    • 2022-01-12
    • 2017-05-05
    相关资源
    最近更新 更多