使用libgdx中的ShaderProgram为游戏菜单创建叠加层

pyk*_*yko 6 shader libgdx

当点击"菜单"按钮时,制作游戏并尝试覆盖屏幕 - 我想象的应该是相当普遍/简单,但仍然有实现它的问题.

我目前的设置:

  • TiledMapRenderer:渲染TMX图块(背景/地图)
  • SpriteBatch:用于各种资产(例如玩家形象)
  • 阶段:按住菜单按钮
  • ShaderProgram:使用GLSL创建叠加/着色效果
  • SpriteBatch和map设置为使用ShaderProgram

正如许多人所建议的,对于性能,我只使用一个SpriteBatch - 因此各种资源和菜单Stage都使用相同的sprite批处理.

着色器的目的是添加一个深色/半透明叠加层以使屏幕变灰,以便打开时菜单更易于阅读.

我遇到的主要问题是因为资源和菜单共享相同的SpriteBatch,它们也共享相同的着色器......所以,当我启用着色效果时,所有内容(背景和菜单按钮)都会变灰.

我怎样才能只使用一个SpriteBatch但只将Shader应用于背景(并保持菜单按钮正常/无阴影)?

aac*_*neo 9

  • 你可以使用:setShader(ShaderProgram shader)

  • 你可以为你的着色器添加一些逻辑以启用叠加(统一,读取一些变化的属性等),但不建议这样做,因为你放在那里的每一行每秒执行一千次.

  • [推荐]你实际上可以绘制一个真正的叠加层.具有透明度的小灰色纹理(8x8px)并在背景之后和菜单之前绘制.那就是屏幕坐标,就像菜单一样,对吗?所以它也不会增加任何复杂性(创建一个足够大的精灵).

  • [高级]当您按下菜单时提供游戏暂停,您可以在单击菜单按钮时将屏幕复制到FBO.然后,您可以对图像进行后期处理(变暗,模糊),并将其用作菜单的背景.这将允许更好的效果,并且实际上更有效,因为洞场景绘制在fbo内部被"缓存"(绘制单个fbo纹理比重新计算孔场景更快).