避免glBindTexture()调用?

时间:2010-09-11 05:47:34

标签: c++ c opengl

我的游戏渲染了很多立方体,随机拥有12个纹理中的1个。我已经Z命令几何,所以我不能只用texture1渲染所有的立方体然后2然后3等...因为这将击败z排序。我已经跟踪了之前的纹理,并且它们是==然后我不调用glbindtexture,但它仍然有太多的调用。我还能做什么?

由于

3 个答案:

答案 0 :(得分:1)

您可以将纹理打包到一个纹理中并相应地偏移纹理坐标

glMatrixMode(GL_TEXTURE)还允许您对纹理空间执行转换(以避免更改所有纹理坐标)

答案 1 :(得分:1)

最终和最快的方法是拥有一系列纹理(普通纹理或立方体贴图)。然后根据存储在每个立方体实例数据/或立方体面数据中的id动态获取纹理切片(如果您希望在每个立方体面上使用不同的纹理),使用GLSL内置gl_InstanceID或{{1} }。

使用此实现,您只需将纹理数组绑定一次。

这当然需要使用gpu_shader4和texture_array扩展名:

我已经使用过这种机制(使用D3D10,但原则也适用)并且效果非常好。

我不得不在sprites(9x9或15x15像素IIRC的恒定屏幕尺寸的3D点)上绘制不同纹理,以指示每个用户的不同含义。

修改

如果你对所有着色器的东西感觉不舒服,我只想按纹理对立方体进行排序,而不是Z对几何体进行排序。然后测量性能增益。

此外,我会尝试添加一个pre-Z pass,只在Z缓冲区渲染所有立方体,然后渲染普通场景,看看它是否加速了事情(如果片段绑定,它可能有帮助)。

答案 2 :(得分:0)

同样来自NVIDIA: Bindless Graphics