c++ - 避免调用 glBindTexture()?

标签 c++ c opengl

我的游戏渲染了许多立方体,这些立方体随机具有 12 种纹理中的一种。我已经对几何体进行了 Z 排序,因此我不能只使用 texture1 然后 2 然后 3 等渲染所有立方体......因为这会破坏 z 排序。我已经跟踪了以前的纹理,它们是 == 然后我不调用 glbindtexture,但它仍然调用了太多次。我还能做什么?

谢谢

最佳答案

最终和最快的方法是拥有一组纹理(普通纹理或立方体贴图)。然后使用 GLSL 内置 gl_InstanceIDgl_PrimitiveID

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

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

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

我必须在 sprite(9x9 或 15x15 像素 IIRC 的恒定屏幕尺寸的 3D 点)上映射不同的纹理,表明每个纹理对用户来说具有不同的含义。

编辑:

如果您对所有着色器的东西不满意,我会简单地按纹理对立方体进行排序,而不是对几何体进行 Z 排序。然后衡量性能提升。

另外,我会尝试添加一个 pre-Z pass,您只在 Z 缓冲区中渲染所有立方体,然后渲染正常场景,看看它是否加快速度(如果片段绑定(bind),它可能会有所帮助)。

关于c++ - 避免调用 glBindTexture()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3689970/

相关文章:

c++ - 字面量类型在运行时的惊人行为

c++ - 状态机 - 保存状态、事件和 pFunc 的结构

c - `printf("…") || printf("…") || printf("…")` 的语义

opengl - 带字节的着色器存储缓冲区对象

c++ - 从 DLL 链接到 OpenGL : glew functions are null when running

c++ - 从网络摄像头以原始分辨率捕获图像

c++ - 为什么我们不能使函数显式化?

c - ‘list’ [C] 之前的预期表达式

C:从类型 char * 分配给类型 char[] 时类型不兼容

java - JOGL(Java OGL)有空闲回调函数吗?