我的游戏渲染了很多立方体,它们随机具有12个纹理中的1个。我已经对几何图形进行了Z排序,因此,我不能仅使用texture1然后2然后3等来渲染所有多维数据集,因为那样会破坏z排序。我已经跟踪了先前的纹理,并且其中的==,所以我不调用glbindtexture,但是仍然需要太多的调用。我还可以做些什么?
谢谢
最佳答案
最终和最快的方法是拥有一系列纹理(普通纹理或立方体贴图)。然后使用GLSL内置的gl_InstanceID
或gl_PrimitiveID
根据存储在每个多维数据集实例数据/或多维数据集面数据(如果您希望在每个多维数据集面的基础上使用不同的纹理)的ID,动态获取纹理 slice 。
通过此实现,您只需绑定(bind)一次纹理数组。
当然,这需要使用gpu_shader4和texture_array扩展:
我已经使用了这种机制(使用D3D10,但原理也适用),并且效果很好。
我必须在子画面(恒定屏幕尺寸为9x9或15x15像素IIRC的3D点)上映射不同的纹理,从而为用户指示不同的含义。
编辑:
如果您不满意所有着色器,我将仅按纹理对多维数据集进行排序,而无需Z对几何进行排序。然后衡量绩效 yield 。
另外,我会尝试添加Z之前的通道,在其中仅在Z缓冲区中渲染所有多维数据集,然后渲染正常场景,并查看它是否加快了速度(如果绑定(bind)了片段,则可能会有所帮助)。