【问题标题】:Why is it necessary to bind a buffer more than once in succession? [duplicate]为什么需要连续多次绑定缓冲区? [复制]
【发布时间】:2013-01-05 22:29:34
【问题描述】:

可能重复:
How does glBufferData know which VBO to work on?

我在 VBO 和渲染缓冲区的示例代码(在 O'Reilly 的书中)中注意到绑定不止一次。这背后的原因是什么?例如,您可能在 OpenGL 例程的顶部有这个:

  glGenBuffers(1, &m_vertexBuffer); 
  glBindBuffer(GL_ARRAY_BUFFER, m_vertexBuffer);

然后在画之前,你再画一遍:

  glBindBuffer(GL_ARRAY_BUFFER, m_vertexBuffer); 
  glVertexPointer(3, GL_FLOAT, sizeof(Vertex), 0);
  //on to the drawing routine

去掉其中任何一个都会导致绘图不出现,那为什么还要绑定两次呢?

另一个例子首先我们这样做:

// Create & bind the color buffer so that the caller can allocate its space.      
   glGenRenderbuffersOES(1, &m_colorRenderbuffer); 
   glBindRenderbufferOES(GL_RENDERBUFFER_OES, m_colorRenderbuffer);

然后,在创建顶点等之后,我们稍后再做一次:

   // Bind the color buffer for rendering. 
      glBindRenderbufferOES(GL_RENDERBUFFER_OES, m_colorRenderbuffer);

【问题讨论】:

  • 这不是真正的重复,而是回答一个问题,回答另一个问题。
  • 如果它不是真正的重复,它不应该投票关闭作为重复。您也不能假设提问者看到了两个不同问题之间的直接关系。
  • 您自己注意到,如果您在进行绘图操作之前忽略绑定缓冲区,事情将无法正常工作。所以关于绑定过程的一些东西让 OpenGL 知道该使用什么。恕我直言,这是一个非常简单和明显的心理联系。投票赞成关闭,因为这两个问题之一是多余的,其中一个应该关闭。
  • 傲慢。 “在我看来,这是一种非常简单而明显的心理联系。”我想你从来没有问过一个比你更了解的人,并且发现这个概念很简单,而你却发现它令人困惑?从来没有?
  • 我想这样说:我确实学习了编程(和 OpenGL),当时没有教程,你必须自己尝试或阅读规范文档,或者通过推断。当然,我四处打听,但我通常会先做一些研究,然后才问我什么时候陷入困境以至于我看不到出路。找出 glBindBuffer 的作用,或 glVertexPointer/glVertexAttribPointer 如何与缓冲区对象交互,比阅读它们的参考文档需要更多的努力。

标签: opengl opengl-es opengl-es-2.0


【解决方案1】:

如果您一直在等待问题的答案How does glBufferData know which VBO to work on? 这个问题也得到了解答。

OpenGL 是一个状态机,它调用 glBindBuffer select 来缓冲下面的操作。

【讨论】:

  • @SebbyJohanns:我不是业力/声誉嫖娼 :) 我也不是刻薄的,我很直率。我现在已经为计算机编程超过 23 年了,我发现让事物交流的唯一方法就是,嗯,直言不讳。
  • @SebbyJohanns:读过 Linus Torvalds 如何与 Linux 内核邮件列表上的人交谈/写作吗?我喜欢他的开放和直接。每当有人提出一件非常愚蠢的事情时,像 Andrew Morton 或 GKH 这样的人都会尝试以外交方式解释它。大多数时候都无济于事。然后,Linus 介入,对每个人的大方向大吼大叫,并且通常会抓住重点。
  • 好的。我看到您正在将自己与 Linus Torvalds 进行比较。对一个人有效的方法并不适用于所有人。
  • @SebbyJohanns:不,我没有将自己与大 L 进行比较。我只是认为他处理这些事情的方式是最有效的。不完美,不保守别人的情绪,但是我们在谈技术的时候,在乎什么情绪呢?你问了两个非常相似的问题(提示,它们都有“buffer”这个词,并被标记为“opengl”),如果一个问题的答案可以阐明另一个问题,则无需等待。这不是解决问题的方法。
【解决方案2】:

不需要连续多次绑定同一个缓冲区。做一次就足够了。在您的带有数组缓冲区的示例中,如果您在绘图例程之前绑定到另一个(或默认 0)缓冲区,则绘图可能不会出现。

【讨论】:

  • 好吧,在任何超出绘制单个简单对象的 OpenGL 程序中,换句话说,除了教程之外的任何内容,您都必须在整个渲染帧期间多次在缓冲区对象之间切换。所以说“没必要”就等于说“哦,你不用喝水,只要我们只是假设今天下午。”
  • @datenwolf,“没必要……连续”。
  • 好吧,在 OPs 程序中的某个地方,缓冲区绑定发生了变化,否则除了第一次调用 glBindBuffer 之外,删除任何内容都没有任何效果。 OP没有说明这些电话是否连续发生。假设一般情况下,它们可能发生在程序的不同位置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-14
  • 2019-01-02
  • 1970-01-01
  • 1970-01-01
  • 2015-04-13
  • 1970-01-01
相关资源
最近更新 更多