Opengl 为什么需要连续多次绑定缓冲区?

Opengl 为什么需要连续多次绑定缓冲区?,opengl,opengl-es,opengl-es-2.0,Opengl,Opengl Es,Opengl Es 2.0,可能重复: 我注意到,在VBOs和渲染缓冲区的示例代码(在O'Reilly的一本书中)中,绑定不止一次。这背后的原因是什么?例如,在OpenGL例程的顶部可能有以下内容: glGenBuffers(1, &m_vertexBuffer); glBindBuffer(GL_ARRAY_BUFFER, m_vertexBuffer); 然后在绘制之前,再次绘制: glBindBuffer(GL_ARRAY_BUFFER, m_vertexBuffer); glVert

可能重复:

我注意到,在VBOs和渲染缓冲区的示例代码(在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
   // Bind the color buffer for rendering. 
      glBindRenderbufferOES(GL_RENDERBUFFER_OES, m_colorRenderbuffer);
删除其中任何一项都会导致图形不显示,那么为什么需要绑定两次呢

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

// Create & bind the color buffer so that the caller can allocate its space.      
   glGenRenderbuffersOES(1, &m_colorRenderbuffer); 
   glBindRenderbufferOES(GL_RENDERBUFFER_OES, m_colorRenderbuffer);
然后,在创建顶点等之后,我们将再次执行此操作:

  glBindBuffer(GL_ARRAY_BUFFER, m_vertexBuffer); 
  glVertexPointer(3, GL_FLOAT, sizeof(Vertex), 0);
  //on to the drawing routine
   // Bind the color buffer for rendering. 
      glBindRenderbufferOES(GL_RENDERBUFFER_OES, m_colorRenderbuffer);

如果你等着你问题的答案 这个问题也得到了回答


OpenGL是一个状态机,它调用glBindBuffer select,以下操作将在哪个缓冲区上工作。

不必连续多次绑定同一缓冲区。只要做一次就够了。在使用数组缓冲区的示例中,如果在绘图例程之前绑定到另一个(或默认0)缓冲区,则绘图可能不会显示

它不是真的复制品,但回答一个问题,回答另一个问题。如果它不是真的复制品,它不应该投票以复制品结束。你也不能假设提问者看到了两个不同问题之间的直接关系。你自己也注意到,如果你在进行绘图操作之前忽略绑定缓冲区,事情就不会发生了。因此,关于绑定过程的一些信息使OpenGL知道使用什么。这是一个非常简单和明显的心理联系。投票结束是因为两个问题中有一个是多余的,其中一个应该结束。傲慢。“在我看来,这是一个非常简单和明显的心理联系。”我想你从来没有问过一个比你知道得多的人,他发现这个概念很简单,而你却感到困惑?从来没有?我想这么说:我确实学过编程(和OpenGL),当时还没有教程,你必须通过尝试或阅读规范文档,或者通过推理自己解决问题。当然,我四处打听,但通常我会先做一些研究,只有当我被困得看不到出路时才会问。找出glBindBuffer做什么,或者glVertexPointer/GLVERTEXAttributePointer如何与缓冲区对象交互比阅读它们的参考文档要花费更多的精力。@SebbyJohanns:我不是因果报应/名誉堕落:)我也不是卑鄙,我是直率的。“我现在已经为计算机编程超过23年了,我发现沟通的唯一方法就是直言不讳。@SebbyJohanns:你有没有读过Linus Torvalds是如何与Linux内核邮件列表上的人交谈/写作的?”?我爱他如此开放和直接。每当有人提出一件非常愚蠢的事情时,像安德鲁·莫顿或吉凯恩这样的人就会试图用外交的方式来解释。大部分时间都没有用。然后,莱纳斯介入,咆哮着进入每个人的大致方向,通常会越过这一点。好的。我看你在拿自己和莱纳斯·托瓦尔兹比较。对一个人有用的东西并不是对每个人都有用。@SebbyJohanns:不,我不是拿自己和大L比较。我只是认为他处理这些事情的方式是最有效的。它并不完美,对他人的情绪也不保守,但当我们谈论技术问题时,我们关心的是什么情绪?你问了两个非常相似的问题(提示,它们都有单词“buffer”在里面,并被标记为“opengl”),而没有等待一个问题的答案是否能对另一个问题有所帮助。这不是解决问题的方法。好吧,在任何OpenGL程序中,除了绘制一个简单的对象,换句话说,除了教程以外的任何东西,你都必须在绘制一个帧的过程中多次在缓冲区对象之间切换。所以说“没必要”和说“哦,你不必喝水,只要我们假设今天下午就可以了。”@datenwolf,“没有必要……连续地”。好吧,在OPs程序中的某个地方缓冲区绑定被更改了,否则删除任何对glBindBuffer的调用都没有效果。OP没有说明这些电话是否连续发生。假设一般情况下,它们可能发生在程序的不同位置。