【问题标题】:Change initial background color in libgdx without glClearColor?在没有 glClearColor 的情况下更改 libgdx 中的初始背景颜色?
【发布时间】:2020-12-09 05:11:00
【问题描述】:

是否可以更改 libgdx 中的默认背景颜色。我想将背景颜色从黑色更改为我想要的任何颜色,而不是清除屏幕。我正在使用 ShapeRenderer 创建一个填充的矩形。然后我让那个矩形在屏幕上移动,我想保留之前渲染的矩形。

使用 Gdx.gl.glClearColor() 和 Gdx.gl.glClear() 显然会在前一个之上重新渲染背景颜色,清除之前渲染的矩形。

如果我不使用 Gdx.gl.glClearColor() 和 Gdx.gl.glClear(),则背景为黑色,矩形渲染和移动是我想要的,除此之外,默认背景颜色为黑色。女巫不是我想要的样子。

【问题讨论】:

  • 先渲染填充您想要的颜色和屏幕尺寸的矩形?渲染到位图然后使用清除和绘制位图?
  • 将您的 Gdx.gl.glClear() 调用包装在适当的 if 语句中。
  • 我的想法可能不同,那么您 Tenfour04 能否详细说明。好像我使用“if”语句来限制何时以及如何调用 Gdx.gl.glClear()。如果我想要一个白色背景 Gdx.gl.glClearColor(1,1,1,1) 并且 Gdx.gl.glClear() 受 if 语句的约束,我不会受到 Gdx.gl.glClearColor( 1,1,1,1)。
  • 哦,我完全误解了你的问题,对不起。
  • 我认为您想要的内容可能存在一些误解。如果我理解正确,您只想设置屏幕的颜色,然后在每个渲染周期绘制矩形而不清除屏幕。这并不意味着在第一个渲染周期中你不能,我认为你应该用你想要的任何颜色清除屏幕。然后正如 Tenfour04 建议的那样,只需使用 if 语句来检查它是否是您的第一个渲染周期,如果不是,请不要清除屏幕(这仍然会保留您的背景颜色,直到您在它上面绘制)。如果我们仍然没有提供帮助,请提供更多详细信息。

标签: java background libgdx


【解决方案1】:

帧缓冲区不知道什么是背景,什么不是。如果您只使用屏幕的帧缓冲区,则更改颜色的唯一方法是清除屏幕并重绘所有内容。因此,在您的情况下,您需要存储第一次用于渲染所有内容的步骤,并在清除屏幕后重播这些步骤。

更简单的方法是为场景的所有内容使用单独的帧缓冲区,并将其绘制在背景上。这将需要一个带有 alpha 组件的帧缓冲区,并且您需要在渲染时使用blendFuncSeparate,以便将 alpha 保留在此帧缓冲区中,以便可以在背景上绘制。您可以在帧缓冲区中使用透明的清晰颜色,并在主帧缓冲区中使用任何您想要的颜色。

libGDX FrameBuffers 是一个很大的话题,在这里解释太多了。您应该从文档开始,如果您开始实施它并遇到问题,您可以创建一个新问题。

【讨论】:

  • 是的,您的第一段完全是我认为我需要做的,但这似乎需要大量处理来存储以前的状态并每次重绘它。我不熟悉创建单独的缓冲区并使用 blendFuncSeparate 但您所解释的似乎是一种更有效的方法。在外行中,我们基本上是在对不同的渲染进行分层。谢谢,这太好了,只是需要有人带我开门。
  • 两种方式的效率差异取决于你的场景是什么。如果您有很长的事件历史会影响场景的最终外观,那么可能第二种方式更好。请记住,绝大多数游戏都会重绘每一帧上的所有内容,以便动画化,因此在大多数情况下,重绘所有内容都可以。另外,我忘了提到,OpenGL 上下文丢失的潜在问题会导致您丢失帧缓冲区的内容(如果您使用上述第二种技术,则可能是屏幕上的内容或您创建的次要内容)。
  • 如果游戏在后台运行,然后又返回,OpenGL 上下文可能会在 Android 上丢失。发生这种情况时,LibGDX 会自动重新加载所有纹理(源自图像文件)、着色器和网格,但它不会自动重新加载帧缓冲区内容,因为它没有任何方法来检索数据。如果无法重放整个场景的绘图,您可能需要将帧缓冲区内容复制到pause() 中的像素图并将它们恢复到resume() 中的帧缓冲区。
  • 我自己没有这样做,所以不能 100% 确定 pause 在潜在的上下文丢失之前发生。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-10-13
  • 2019-06-14
  • 2012-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-26
相关资源
最近更新 更多