2011-03-03 171 views
3

我正在滚动我的第一个游戏引擎:D。我现在正在研究纹理资源管理器,并且我想正确地做。OpenGL纹理管理

以任何方式填充驱动程序支持的所有ActiveTexture单元都不好吗?另一种方法是保存这些插槽,并在实际需要时设置纹理,代价是更多的glBindTexture调用。

+1

哟是什么意思'插槽'?你只需要在内存中保存尽可能多的纹理,并且(理想情况下)只在必要时进行绑定,如果已经绑定了正确的纹理,则试图避免调用。 – 2011-03-03 23:53:04

+0

对不起。插槽我的意思是单位。就像你用glActiveTexture(...)调用选择的那样;)。 – Hannesh 2011-03-04 00:01:31

回答

5

你问你的问题的方式,我认为你从纹理对象即纹理存储之间的误解受苦,纹理单元即后面多纹理的机制。

OpenGL具有纹理对象和纹理单元。纹理对象保存数据,纹理单元将绑定到纹理对象的数据映射到渲染过程。

通常会将场景所需的所有纹理上传到纹理对象中。对于每个使用常用材质设置的渲染批处理,纹理都会在渲染过程中绑定到正确的纹理单元。

+0

如果我的问题不清楚,我很抱歉,我理解纹理和纹理单元之间的区别。如果GL_MAX_TEXTURE_UNITS大于我拥有的纹理数量,我可以将所有纹理映射到纹理单元,并避免在绘图期间使用glBindTexture调用吗? – Hannesh 2011-03-04 10:20:22

+1

当然你可以做到这一点,但你认为这样做的好处。将所有纹理绑定到纹理单元将使GPU对它们进行采样。除非您禁用单纹理单位,在这种情况下,取消/绑定不会导致任何额外成本。绑定纹理或启用纹理单元的整个结果源于缓存失效。改善渲染性能的更好方法是按照使用的材质和纹理状态对绘图操作进行排序,并将状态开关保持为最小值。剥离/启用纹理单元也会产生成本。 – datenwolf 2011-03-04 10:34:10

+0

@datenwolf:你的答案在这里与染料/绘画比喻在这里http://stackoverflow.com/questions/8866904/need-help-understanding-the-differences-and-relationship-between-glactivetexture(再次由你)作出我了解OpenGL中的纹理管理:)谢谢! – legends2k 2012-09-05 15:51:29

2

我认为如果你要使用大量纹理,即上传到GPU,你需要考虑一种最小化VRAM使用的方法。在任何情况下,我认为可能是您的一个好处是stb_dxt,这是一个DXT1/DXT5压缩器在ansi C中编写的。您可以压缩您的纹理并使用CompressedTexture2D将其上传,这样,您上传到GPU的所有纹理都将需要1 /他们的正常空间的八分之一。

在某些时候,在运行时压缩所有纹理会减慢游戏的加载速度,这就是为什么我会建议使用DDS纹理的原因,您可以使用nvidia-texture工具在外部转换/管理纹理压缩。