【问题标题】:OpenGL bind when already boundOpenGL绑定时已经绑定
【发布时间】:2012-09-24 14:30:00
【问题描述】:

我正在用 OpenGL 3.2+ 编写引擎。一个可渲染对象有一个网格(又名 VAO)和几个材质(又名着色器和程序)。所有的可渲染对象都存储在一个渲染队列中,该队列对材质和网格的渲染过程进行排序,从而需要最少的 OpenGL 绑定调用。

但是,有时它会绑定已绑定的对象,我的问题是:OpenGL 是否会自动检测您何时尝试绑定已绑定的对象并跳过所有昂贵的操作,或者您是否必须实现一个系统来检测一个对象是否已经被你自己绑定了?

如果 OpenGL 没有检测到这一点,通过 glGet* 获取对象名称并与您尝试绑定的对象进行比较或者自己跟踪当前绑定的对象是否可能更快?

【问题讨论】:

  • 这不是一个可以回答的问题。您必须对其进行概要分析。 OpenGL 规范定义了行为,而不是性能,这是此类系统会改变的全部内容。
  • 对不起,如果我在这里脱节了,但第一个问题是 OpenGL 是否检查已经绑定的对象,这不适合行为吗?
  • 不,不会。规范说调用glBind* 将导致前一个对象未​​绑定并绑定新对象,以便后续调用使用新对象的状态来绑定目标。就规范而言,驱动程序 在内部为实现这一目标所做的工作(这就是您所说的)无关。如果驱动程序检查先前绑定的是否是新绑定,从而决定避免无操作,这取决于驱动程序。只要外界无法区分,规范就不会在意。

标签: c++ performance opengl graphics binding


【解决方案1】:

我不认为规范要求执行此类检查,但每个主要实现都需要。但是,如果您决定自己做 - 为什么不自己存储值呢? glGet 在这里没有特别的兴趣。顺便说一句,材质和着色器不是一回事。

【讨论】:

  • 我明白了,谢谢你的回复!我确实找不到任何规范,但我也找不到任何性能下降,这回答了这个问题。顺便说一句,就我而言,程序是通过材料访问的,所以为了清楚我在说什么,我只是将它们称为着色器和程序;)
【解决方案2】:

通常,当您启用某些东西时,您需要在不需要它之后将其禁用。因此,答案是:您必须跟踪程序中所做的事情。

我能想到的最简单的例子是:

glEnable(GL_TEXTURE_2D);
glBindTexture( 0, id );
// render
glDisable(GL_TEXTURE_2D);

【讨论】:

  • 我知道,问题是有时我不知道特定对象没有用处,直到必须绑定一个新对象,而新对象可能完全一样对象。
  • @Invalid 我的意思是如果你绑定了一些东西,你必须在完成后解除绑定。而且你不应该在两者之间绑定另一个。无论如何,keltar 的措辞更好
猜你喜欢
  • 2012-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-18
  • 1970-01-01
相关资源
最近更新 更多