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

时间:2013-02-22 13:32:12

标签: shader libgdx

目前制作一款游戏并试图在单击“菜单”按钮时覆盖屏幕 - 我想象的应该是相当普遍/简单,但仍然无法实现它。

我目前的设置:

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

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

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

我遇到的主要问题是因为资源和菜单共享相同的SpriteBatch,它们也共享相同的着色器...所以,当我启用着色效果一切(背景和菜单按钮)显示为灰色。

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

2 个答案:

答案 0 :(得分:9)

  • 你可以使用:setShader(ShaderProgram着色器)

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

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

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

答案 1 :(得分:2)

在询问libgdx论坛后,想出来了 - 解决方案是在着色器中设置强度,然后在绘制下一个之前刷新批次(即spriteBatch.flush())的事情。

粗略地说......

spriteBatch.start();
//draw stuff
spriteBatch.flush();
// set shader strength/variables
// draw more stuff (is now affected by shader)
spriteBatch.end();