我的游戏渲染了许多立方体,这些立方体随机具有 12 种纹理中的一种。我已经对几何体进行了 Z 排序,因此我不能只使用 texture1 然后 2 然后 3 等渲染所有立方体......因为这会破坏 z 排序。我已经跟踪了以前的纹理,它们是 == 然后我不调用 glbindtexture,但它仍然调用了太多次。我还能做什么?
谢谢
最佳答案
最终和最快的方法是拥有一组纹理(普通纹理或立方体贴图)。然后使用 GLSL 内置 gl_InstanceID
或 gl_PrimitiveID
。
使用此实现,您只需绑定(bind)一次纹理数组。
这当然需要使用 gpu_shader4 和 texture_array 扩展:
- http://developer.download.nvidia.com/opengl/specs/GL_EXT_gpu_shader4.txt
- http://developer.download.nvidia.com/opengl/specs/GL_EXT_texture_array.txt
我已经使用过这种机制(使用 D3D10,但原则也适用)并且效果很好。
我必须在 sprite(9x9 或 15x15 像素 IIRC 的恒定屏幕尺寸的 3D 点)上映射不同的纹理,表明每个纹理对用户来说具有不同的含义。
编辑:
如果您对所有着色器的东西不满意,我会简单地按纹理对立方体进行排序,而不是对几何体进行 Z 排序。然后衡量性能提升。
另外,我会尝试添加一个 pre-Z pass,您只在 Z 缓冲区中渲染所有立方体,然后渲染正常场景,看看它是否加快速度(如果片段绑定(bind),它可能会有所帮助)。
关于c++ - 避免调用 glBindTexture()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3689970/