Libgdx:“战争迷雾”效果的帧缓冲区

     2023-02-22     231

关键词:

【中文标题】Libgdx:“战争迷雾”效果的帧缓冲区【英文标题】:Libgdx: Framebuffer for "Fog of War"-Effect 【发布时间】:2016-03-18 08:13:52 【问题描述】:

我正在为 Android 编写一个 RTS 游戏,我希望在玩家的单位上添加“战争迷雾”效果。这种效果意味着每个单位周围只有一个“圆圈”显示背景地图,而在没有玩家单位的地方,屏幕应该是黑色的。我不想使用着色器。

我有它的第一个版本。我正在做的是将地图渲染到默认帧缓冲区,然后我有第二个完全黑色的帧缓冲区(类似于灯光技术)。在玩家单位所在的位置,然后我批量绘制一个完全透明的纹理,中间有一个边缘模糊的白色圆圈。 最后,我使用 Gdx.gl.glBlendFunc(GL20.GL_DST_COLOR, GL20.GL_ZERO);

在第一个上绘制第二个(浅色)FrameBuffer 的 colorTexture

现在的视觉效果是整个地图确实是黑色的,并且可以看到围绕我的单位的圆圈 - 但是添加了很多白色。 原因很清楚,因为我为这样的单位绘制了光纹理:

lightBuffer.begin();
        Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE);

        Gdx.gl.glEnable(GL20.GL_BLEND);

        Gdx.gl.glClearColor(0.1f, 0.1f, 0.1f, 1f);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

        batch.setProjectionMatrix(camera.combined);
        batch.begin();

        batch.setColor(1f, 1f, 1f, 1f);
        for (RTSTroopAction i : unitList) 
                batch.draw(lightSprite, i.getX() + (i.getWidth() / 2) - 230, i.getY() + (i.getHeight() / 2) - 230, 460, 460); //, 0, 0, lightSprite.getWidth(), lightSprite.getHeight(), false, true);

        

        batch.end();
        lightBuffer.end();

但是,我不想要原始纹理上的“白色东西”,我只想让原始背景发光。我怎样才能做到这一点?

我认为它正在使用 blendFuncs,但我无法弄清楚要使用哪些值。

【问题讨论】:

你应该看看 glsl 着色器的使用或粒子。 请注意,当您调用 batch.end() 时,直接设置 glBlendFunc 会被分配给 SpriteBatch 的任何混合函数覆盖。我不清楚为什么要添加白色。如果您使用Gdx.gl.glBlendFunc(GL20.GL_DST_COLOR, GL20.GL_ZERO);,颜色只会变得更暗,因为您只是在相乘。但是,如果您使用精灵批处理将帧缓冲区的纹理绘制到屏幕上,那么这可能不是您实际使用的混合功能。 【参考方案1】:

感谢 Tenfour04 指向正确的方向,我能够找到解决方案。首先,问题不直接在batch.end(); 中。问题是,精灵批次确实维护了自己的 blendFunc 设置。这些在 flush(); 时被应用;叫做。 (end() 也调用它)。 但是,当批处理绘制一个绑定到与上一次 draw() 调用中使用的纹理不同的纹理的 TextureRegion 时,它也会调用 flush。

所以在我的原始代码中:当我调用 batch.draw(lightBuffer,...) 时,我设置的任何 blendFunc 总是被覆盖。解决方案是使用 spritebatch 的 blendFunc 而不是 Gdx.gl.blendFunc。

总的工作代码最终看起来像这样:

lightBuffer.begin();
        Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);
        Gdx.gl.glEnable(GL20.GL_BLEND);          
// start rendering to the lightBuffer
// set the ambient color values, this is the "global" light of your scene
        Gdx.gl.glClearColor(0.1f, 0.1f, 0.1f, 1f);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
// start rendering the lights 
        batch.setProjectionMatrix(camera.combined);
        batch.begin();
// set the color of your light (red,green,blue,alpha values)
        batch.setColor(1f, 1f, 1f, 1f);
        for (RTSTroopAction i : unitList) 
            if (i.getOwnerId() == game.getCallback().getPlayerId()) 
                batch.draw(lightSprite, i.getX() + (i.getWidth() / 2) - 230, i.getY() + (i.getHeight() / 2) - 230, 460, 460); //, 0, 0, lightSprite.getWidth(), lightSprite.getHeight(), false, true);
            
        
        batch.end();
        lightBuffer.end();

// 现在我们将 lightBuffer 渲染到默认的“帧缓冲区” // 正确的混合!

        Gdx.gl.glEnable(GL20.GL_BLEND);
        Gdx.gl.glBlendFunc(GL20.GL_ZERO, GL20.GL_SRC_COLOR);
        batch.setProjectionMatrix(getStage().getCamera().combined);
        batch.enableBlending();
        batch.setBlendFunction(GL20.GL_ZERO, GL20.GL_SRC_COLOR);
        batch.begin();

        Gdx.gl.glEnable(GL20.GL_BLEND);
        Gdx.gl.glBlendFunc(GL20.GL_ZERO, GL20.GL_SRC_COLOR);
        batch.draw(lightBufferRegion,0, 0, getStage().getWidth(), getStage().getHeight());
        batch.end();
        batch.setBlendFunction(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);

【讨论】:

如何在unity3d中实现战争迷雾效果

参考技术AiTweeniTween.CameraFadeToiTween.CameraFadeFrom,或者用深度摄像机,改切换画面color.a 查看详情

unity如何实现战争迷雾?思路一(代码片段)

unity如何实现战争迷雾?思路一 断更很久了,刚好今天放假,写一个unity下实现战争迷雾的思路.  效果如下:    思路如下:建一个plane作为地面,用UI中的rawimage放在最上层作为迷雾显示,用cube作为主角移动.cube每... 查看详情

游戏中的战争迷雾

转自:http://blog.csdn.net/xoyojank/article/details/12259161说到战争迷雾(FogofWar,FOW),其实还是非常普遍的一项技术,在RPG,RTS等游戏中得到了广泛的应用 但是关于这方面的资料非常少,经常会有人问怎么做,所以就有了写这篇文章的想法从... 查看详情

聊一聊2d地图的迷雾效果

...受了。今天先让我们专注于川最新解决的实际项目问题。战争迷雾是很多带地图的游戏多少会考虑的一个功能。恰巧川在17年下半年开始做的项目也涉及到了这次的内容,而且在开始审题时,这简直是送分题啊!我们先来看看题... 查看详情

unity战争迷雾fogofwar

...arEffect.shader做一下“颜色乘法”运算再渲染到屏幕,实现战争迷雾。你可以想象上面的col极端2种情况:于是我们把战争迷雾“庞大”(其实并不庞大)的工程,简化成解决1个大问题:把是否可视区域映射到FogOfWarEffect.shader的col。... 查看详情

libgdx open gles 2.0 模板 alpha 遮罩

...正在寻找一种解决方案,通过opengles2.0在libgdx中使用模板缓冲区实现alpha屏蔽。我已经设法使用模板缓冲区和着色器实现简单的alpha掩码,如果片段的alpha通道大于某个指定值,它就会被丢弃。效果很好。问题是当我想使 查看详情

Libgdx 模板缓冲区重叠

】Libgdx模板缓冲区重叠【英文标题】:LibgdxStencilBufferoverlap【发布时间】:2016-07-2610:17:41【问题描述】:我有一个关于在OpenGL和libgdx中使用StencilBuffer的问题例如,我需要绘制重叠的圆圈。render方法的代码在这里:Gdx.gl.glClearColor(1... 查看详情

libgdx 贴花未绘制到模板缓冲区中

】libgdx贴花未绘制到模板缓冲区中【英文标题】:libgdxdecalnotdrawingintostencilbuffer【发布时间】:2014-07-1613:53:29【问题描述】:我正在使用libgdx引擎开发3d应用程序。我刚刚发现decalBatch没有绘制到模板缓冲区中。我想为3d世界制作... 查看详情

libgdx 中帧缓冲区的模棱两可的结果

】libgdx中帧缓冲区的模棱两可的结果【英文标题】:AmbiguousresultswithFrameBuffersinlibgdx【发布时间】:2013-02-0613:12:08【问题描述】:我在libgdx中使用FrameBuffer类得到以下奇怪的结果。这是产生此结果的代码://Thisistherenderingcode@Override... 查看详情

OpenGL 帧缓冲区 + LibGDX

】OpenGL帧缓冲区+LibGDX【英文标题】:OpenGLframebuffer+LibGDX【发布时间】:2016-05-0114:06:22【问题描述】:openGL帧缓冲区有一个问题。我想实现:绑定FBO1。将image1绘制到FBO1。解绑FBO1。绑定FBO2。画出FBO1到FBO2。解绑FBO2。绑定FBO1。将ima... 查看详情

libGDX:FrameBuffer 大小限制 == 最大纹理大小?

...2016-02-2511:14:58【问题描述】:我想将我的libGDX游戏渲染到缓冲区,然后将缓冲区的内容渲染到屏幕。为此,我计划使用FrameBuffer。缓冲区尺寸假设等于屏幕的大小。例如,在平板电脑上可以是2048x1536。由于FrameBuffer 查看详情

如何在 libgdx 中重用帧缓冲纹理

...布时间】:2014-02-2509:14:33【问题描述】:是否有可能将帧缓冲区保存到纹理。这样我就可以重用帧缓冲区来创建新的纹理?com.badlogic.gdx.graphics.glutils.FrameBuffer.getColorBufferTexture()每次都会返回相同的纹理。编辑:我计算阴影,不 查看详情

Libgdx 帧缓冲区混合不起作用

】Libgdx帧缓冲区混合不起作用【英文标题】:Libgdxframebufferblendingnotworking【发布时间】:2013-12-2004:03:44【问题描述】:我正在尝试在我的游戏中制作动态2D阴影。我成功地将阴影渲染到帧缓冲区。(灰色和白色方块表示透明度)... 查看详情

opengl学习脚印:帧缓冲对象(framebufferobject)

...以来,我们在使用OpenGL渲染时,最终的目的地是默认的帧缓冲区,实际上OpenGL也允许我们创建自定义的帧缓冲区。使用自定义的帧缓冲区,可以实现镜面,离屏渲染,以及很酷的后处理效果。本节将学习帧缓存的使用,文中示例... 查看详情

Android opengl 1.1 Render to Texture 1286错误(无效的帧缓冲操作)

...动模糊效果。经过大量研究,我发现最好的方法是使用帧缓冲区对象将前一帧保存为纹理并将其渲染到当前帧 查看详情

我的帧缓冲区有啥问题?

】我的帧缓冲区有啥问题?【英文标题】:What\'swrongwithmyframebuffer?我的帧缓冲区有什么问题?【发布时间】:2014-03-0719:04:19【问题描述】:我正在创建一个帧缓冲区对象作为延迟着色的gbuffer。我主要从http://ogldev.atspace.co.uk/学习... 查看详情

计算机图形学(opengl):帧缓冲

...建帧缓冲(FBO):  接着我们将这个FBO对象绑定至帧缓冲区目标:  当然我们可以单独的绑定到可读帧缓冲区(GL_READ_FRAMEBUFFER)和可绘制帧缓冲区(GL_DRAW_FRAMEBUFFER)。  但现在还不能使用这个帧缓冲,我们还需要... 查看详情

ios上的帧缓冲区对象渲染

】ios上的帧缓冲区对象渲染【英文标题】:framebufferobjectrenderingonios【发布时间】:2013-09-2513:49:49【问题描述】:我在ios上进行屏幕外渲染时遇到问题。下面是设置帧缓冲区对象和相关缓冲区的代码。它与苹果开发者中心的代码... 查看详情