6

目前正在制作游戏并尝试在单击“菜单”按钮时覆盖屏幕 - 我认为这应该是相当常见/简单的,但仍然存在实现它的问题。

我目前的设置:

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

正如许多人所建议的那样,出于性能考虑,我只使用一个 SpriteBatch - 因此各种资产和菜单舞台都使用相同的精灵批次。

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

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

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

4

2 回答 2

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

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

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

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

于 2013-02-25T15:06:10.567 回答
2

在 libgdx 论坛上四处询问后,发现了 - 解决方案是在着色器中设置强度,然后spriteBatch.flush()在绘制下一件事之前刷新批次(即)。

那么大致...

spriteBatch.start();
//draw stuff
spriteBatch.flush();
// set shader strength/variables
// draw more stuff (is now affected by shader)
spriteBatch.end();
于 2013-02-26T11:13:01.313 回答