【发布时间】:2017-02-25 00:42:33
【问题描述】:
我不确定我所做的是否是最佳的。
我有三个纹理(其中两个是堆叠有大量信息的数组纹理),我做了三个渲染通道:
具有纹理 1 的关卡几何体
具有纹理 2 的世界实体
具有纹理 3 的 HUD 内容
因此,我的代码通常会执行类似这样的伪代码:
bindTexture(tex1);
drawLevel();
unbindTexture(tex1); // Is this necessary if I just bind after anyways?
bindTexture(tex2);
drawEntities();
unbindTexture(tex2);
bindTexture(tex3);
drawHUD();
unbindTexture(tex3);
因为我记得看到在 GL_TEXTURE0、GL_TEXTURE1 等上最多允许 16 个(或更多)单独的纹理,这是否意味着我可以将我的世界纹理写入 GL_TEXTURE0,将实体写入 GL_TEXTURE1,将 HUD 写入 GL_TEXTURE2 和没有性能损失,或者很少? 或者改变活动纹理是否会带来明显的损失?
我问是因为我记得看到纹理交换是一项繁重的操作。这是否意味着即使我改变了我的活动纹理,它仍然很费力?还是仅当您拥有超过 16 个左右的纹理并不断将它们推送到 GPU 时才会产生负担?
这是错误的还是慢的?
我只需要 3 个纹理,所以如果有最优化的方法,我会很高兴学习它。
假设我使用的是 core 3.3 而不是 4.5(但如果在 4.2 或更高版本中有更好的方法,我也很乐意听到这些)。它也应该适用于 nvidia 和 AMD 或过去 4-5 年发布的任何 GPU。
编辑:如果您发现我所说的任何奇怪的概念是错误的,请纠正我,因为我是新手。出于这个原因,我更希望有人在他们的回答中冗长。
【问题讨论】:
-
This blog link 关于
glActiveTexture的性能注意事项可能也会有所帮助。