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