【发布时间】:2012-09-24 14:30:00
【问题描述】:
我正在用 OpenGL 3.2+ 编写引擎。一个可渲染对象有一个网格(又名 VAO)和几个材质(又名着色器和程序)。所有的可渲染对象都存储在一个渲染队列中,该队列对材质和网格的渲染过程进行排序,从而需要最少的 OpenGL 绑定调用。
但是,有时它会绑定已绑定的对象,我的问题是:OpenGL 是否会自动检测您何时尝试绑定已绑定的对象并跳过所有昂贵的操作,或者您是否必须实现一个系统来检测一个对象是否已经被你自己绑定了?
如果 OpenGL 没有检测到这一点,通过 glGet* 获取对象名称并与您尝试绑定的对象进行比较或者自己跟踪当前绑定的对象是否可能更快?
【问题讨论】:
-
这不是一个可以回答的问题。您必须对其进行概要分析。 OpenGL 规范定义了行为,而不是性能,这是此类系统会改变的全部内容。
-
对不起,如果我在这里脱节了,但第一个问题是 OpenGL 是否检查已经绑定的对象,这不适合行为吗?
-
不,不会。规范说调用
glBind*将导致前一个对象未绑定并绑定新对象,以便后续调用使用新对象的状态来绑定目标。就规范而言,驱动程序 在内部为实现这一目标所做的工作(这就是您所说的)无关。如果驱动程序检查先前绑定的是否是新绑定,从而决定避免无操作,这取决于驱动程序。只要外界无法区分,规范就不会在意。
标签: c++ performance opengl graphics binding