目前制作一款游戏并试图在单击“菜单”按钮时覆盖屏幕 - 我想象的应该是相当普遍/简单,但仍然无法实现它。
我目前的设置:
正如许多人所建议的那样,对于性能,我只使用一个SpriteBatch - 因此各种资源和菜单Stage都使用相同的sprite批处理。
着色器的目的是添加一个深色/半透明叠加层以使屏幕变灰,以便在打开时更容易阅读菜单。
我遇到的主要问题是因为资源和菜单共享相同的SpriteBatch,它们也共享相同的着色器...所以,当我启用着色效果一切(背景和菜单按钮)显示为灰色。
如何只使用一个SpriteBatch但只将Shader应用于背景(并保持菜单按钮正常/无阴影)?
答案 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();