使用gl.DrawElements时在glsl中使用多个纹理图集

时间:2013-10-22 16:35:48

标签: opengl textures glsl

所以我使用现代OpenGL制作了一个相当复杂的2D游戏。现在我正在为模型矩阵,纹理线等传递一个VBO,用于我的所有精灵(它是一个基于“实体”的游戏,因此一切都是一个精灵)到着色器并使用glDrawElements绘制它们。一切都工作正常,我可以绘制成千上万的变形精灵,我有一个使用变焦等工作的相机系统。但是,我使用一个sampler2D制服与我的纹理图集。问题是我希望能够使用多个纹理图集。其他游戏/引擎如何处理这个问题?

我唯一能想到的是这样的事情:

我知道我最多可以绑定GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS个纹理,但是为了绘制它们,我需要为每个纹理设置一个sampler2D制服并将它们传递给着色器。然后,在着色器中,我需要知道在绘制时使用哪个sampler2D。我不知何故需要根据我在VBO中的数据来解决这个问题(我假设我会为每个顶点传递纹理ID或其他内容)。这种方法甚至可以使用glDrawElements,是否有更好/理智的方法来做到这一点?我意识到我可以通过纹理图集对我的精灵进行排序并使用多个glDrawElement调用,但问题是我需要精灵按照特定的顺序进行分层。

如果不是很清楚,请告诉我,以便我可以尝试改写它。我是OpenGL的新手,所以当我甚至不知道自己在做什么时,我很难解释我想要做什么。

1 个答案:

答案 0 :(得分:0)

  • bind atlas 1
  • 绘制使用atlas 1的对象
  • bind atlas 2
  • 绘制使用atlas 2的对象
  • ...

将是简单的方法。对于性能不那么重要的2D游戏,其他方法往往过于复杂。使用VBO时,您只需要为您使用的每个地图集添加索引缓冲区。