在 Libgdx 中实现简单运动模糊的意外结果

     2023-02-25     306

关键词:

【中文标题】在 Libgdx 中实现简单运动模糊的意外结果【英文标题】:Unexpected results implementing simple motion blur in Libgdx 【发布时间】:2012-06-07 05:50:00 【问题描述】:

在所附的两张图片中,libgdx 的桌面截图按预期运行。不幸的是,我的 Galaxy Nexus 的屏幕截图不如预期。我正在尝试创建一个简单的运动模糊或轨迹效果。

在我的桌面上按预期进行渲染。

在我的 Galaxy Nexus 上未按预期呈现。

圆形纹理在渲染过程中在for循环中绘制,并且使用在圆形之前绘制的0,0,0,0.1f的RGBA的像素图来实现效果。

screenClearSprite 创建

Pixmap screenClearPixmap = new Pixmap(256, 256, Format.RGBA8888);
screenClearPixmap.setColor(Color.rgba8888(0, 0, 0, 0.1f));
screenClearPixmap.fillRectangle(0, 0, 256, 256);
screenClearTexture = new Texture(screenClearPixmap);
screenClearSprite = new Sprite(screenClearTexture);
screenClearSprite.setSize(screenWidth, screenHeight);
screenClearPixmap.dispose();

渲染

batch.begin();
font.draw(batch, "fps:" + Gdx.graphics.getFramesPerSecond(), 0, 20);
screenClearSprite.draw(batch);
for (int i = 0; i < circleBodies.size(); i++) 
    tempPos = circleBodies.get(i).getPosition();
    batch.draw(circleTexture, (tempPos.x * SCALE) + screenWidthHalf
            - circleSizeHalf, (tempPos.y * SCALE) + screenHeightHalf
            - circleSizeHalf);

batch.end();

那么,我做错了什么?也许有更好的方法来获得运动的“运动模糊”效果?

【问题讨论】:

你能在其他安卓设备上重现这种行为吗? 你确定有问题吗,因为第二个屏幕截图上的球看起来比第一个屏幕截图上的球移动得慢?你的游戏循环是什么?您是否使用当前时间来计算运动模糊 - 可能是与您的 PC CPU 相比,nexus 的 CPU 更快/更慢。 是的,这可以在我的 Vibrant 和 Galaxy Nexus S 上重现。至于模糊,它们没有运动模糊计算。运动模糊可能不是该效果的最准确术语。我正在寻找的效果在顶部图像中准确描绘。问题似乎是作为不透明层绘制的纹理不能正确计算到 1。这会导致令人讨厌的条纹,我无法解释,因为它在我的两台电脑上按预期工作。 【参考方案1】:

这是一种不同的方法,您每次都使用纯色和无 alpha 清除屏幕。

这意味着您将不得不修改您的代码。这样做的好处是,您执行此操作的方式存在一些缺陷:它会使运动中的一切变得模糊,而不仅仅是球。除非你小心,否则很快就会产生丑陋的结果/伪影。

    和你现在做的一样,但不是将球绘制到批次中,而是将它们绘制到纹理/位图/其他上。然后每一帧在球图像上添加一个 alpha 混合图像,然后在其顶部绘制球的当前位置。然后将该图像添加到您的屏幕。很像你现在正在做的,除了你画到别的东西上并保持它。这样您就不必依赖正在绘制的视口,并且可以将所有内容分开。 此方法类似于绘制到累积缓冲区

    您可以跟踪每个球的 n 个最新位置,而不是按照您的方式进行操作。然后在每一帧都用不同的 alpha 绘制它们。这很容易实现。如果您有很多球或较大的 n,可能会导致许多绘图调用,但如果不是太多,则不应限制您的 fps 并提供良好的控制。

【讨论】:

#1 可能是最好的选择。我实施了#2,但球必须移动得非常快才能看到轨迹,所以我需要更改保存先前位置的频率,以获得良好的长轨迹。或者,直到稍后我才能对此进行测试,也许精灵本身允许修改 alpha,这与我原来的方法相同,但可能会按预期工作。所以创建 alpha 为 1 的像素图,然后使用 0.1f 的 sprite alpha。 sprite 在 Libgdx 中是否具有该功能? @tencent 你可以使用glBlendFuncglBlendColor来乘法混合纹理颜色和一个常量颜色。【参考方案2】:

也许有更好的方法来获得“运动模糊”效果 运动?

为了在我的游戏中制作运动模糊,我使用了另一种方法“粒子效果”,它对我非常有效,而且我没有 Android/桌面问题或不同的 Android 设备

您所要做的就是使用 Libgdx 的“粒子效果编辑器”并制作您的效果,然后将其加载到您的项目中,最后在您绘制对象的同一位置绘制它(并且也绘制您的对象)

使用 Particle Editor 制作正确效果文件的提示:

在粒子效果中设置(使用)您想要使其运动模糊的对象的相同图像

尝试限制count:允许的最大粒子数

禁用“速度”和“角度” 参数

粒子效果有助于做运动效果 希望这会对某人有所帮助!

【讨论】:

Libgdx/Opengl alpha blending(结果 alpha 被源 alpha 替换)

】Libgdx/Openglalphablending(结果alpha被源alpha替换)【英文标题】:Libgdx/Openglalphablending(resultalphaisreplacedbysourcealpha)【发布时间】:2014-02-2416:26:08【问题描述】:我正在尝试在opengl中实现后处理,我的问题是非透明图像上有透明图像... 查看详情

如何在 Keras 中实现高斯模糊层?

】如何在Keras中实现高斯模糊层?【英文标题】:howdoIimplementGaussianblurringlayerinKeras?【发布时间】:2019-09-0217:59:10【问题描述】:我有一个自动编码器,我需要在输出后添加一个高斯噪声层。我需要一个自定义层来执行此操作,... 查看详情

如何在 PHP 中实现分页? [关闭]

】如何在PHP中实现分页?[关闭]【英文标题】:HowdoyouimplementpaginationinPHP?[closed]【发布时间】:2010-09-2100:57:37【问题描述】:PHP中通常如何实现分页结果?我想要一个包含10个结果的结果页面。在导航中向前翻页会给我下一组和上... 查看详情

如何在stm32中实现模糊自整定pid算法

参考技术A不管在什么单片机或者ARM芯片中,你需要的是PID算法,你需要将你的模糊整定PID算法使用C语言编程实现你的PID整定功能。本回答被提问者采纳 查看详情

如何在canvas中实现自定义路径动画(代码片段)

在最近的项目中笔者需要做一个新需求:在canvas中实现自定义的路径动画。这里所谓的自定义路径不单单包括一条直线,也许是多条直线的运动组合,甚至还包含了贝塞尔曲线,因此,这个动画也许是下面这个样子的:那么如何... 查看详情

python中实现模糊匹配的魔法库:fuzzywuzzy

在日常开发工作中,经常会遇到这样的一个问题:要对数据中的某个字段进行匹配,但这个字段有可能会有微小的差异。比如同样是招聘岗位的数据,里面省份一栏有的写“广西”,有的写“广西壮族自治区... 查看详情

在 qt 中实现 GUI Shell

】在qt中实现GUIShell【英文标题】:ImplementingaGUIShellinqt【发布时间】:2013-04-1110:02:45【问题描述】:我想使用QTextEdit在Qt中实现一个简单的图形外壳。我想获取用户命令并在QTextEdit中打印结果。下面的代码返回QTextEdit的全部内容... 查看详情

在 Node 中的缓冲区上调用 toString 时出现意外结果

】在Node中的缓冲区上调用toString时出现意外结果【英文标题】:UnexpectedresultwhencallingtoStringonabufferinNode【发布时间】:2021-08-1211:10:01【问题描述】:我需要将数据恢复到已调用toString的缓冲区。例如:constbuffer//Ineedthis,orequivalentcon... 查看详情

光流(opticalflow)和opencv中实现

...!!!http://blog.csdn.net/zhonghuan1992光流(opticalflow)和openCV中实现光流的概念:      是Gibson在1950年首先提出来的。它是空间运动物体在观察成像平面上的像素运动的瞬时速度。是利用图像序列中像素在时间... 查看详情

在 LibGDX 中模糊屏幕

】在LibGDX中模糊屏幕【英文标题】:BlurthescreeninLibGDX【发布时间】:2013-10-0518:42:30【问题描述】:我正在尝试为我的暂停菜单创建背景效果likethis。我目前的想法是在暂停时截取屏幕截图,保存,打开,高斯模糊,然后将其渲染... 查看详情

在字符串中实现每个查询的结果

】在字符串中实现每个查询的结果【英文标题】:Realiseresultofeveryqueryinastring【发布时间】:2016-07-1818:18:32【问题描述】:我是Clojure的新手,正在开发一个jdbc应用程序,其中我有一个字符串,该字符串中定义了三个查询,如下所... 查看详情

为啥我尝试在 C# 中实现基本的自旋锁会得到这个结果?

】为啥我尝试在C#中实现基本的自旋锁会得到这个结果?【英文标题】:WhyamIgettingthisresultwithmyattempttoimplementabasicspin-lockinC#?为什么我尝试在C#中实现基本的自旋锁会得到这个结果?【发布时间】:2021-03-2004:24:49【问题描述】:尝... 查看详情

在 TypeScript 1.8 中实现一个简单的字典

】在TypeScript1.8中实现一个简单的字典【英文标题】:ImplementingasimpleDictionaryinTypeScript1.8【发布时间】:2016-09-1801:10:41【问题描述】:我正在尝试找到一种在TypeScript1.8中实现Dictionary的简单方法。网上有几种实现建议,但最吸引人... 查看详情

在unity中实现简单的伪时间同步

在Unity中实现简单的伪时间同步,只是读取数据库所在电脑的当前时间代码如下:usingUnityEngine;usingSystem.Collections;usingSystem.Runtime.InteropServices;usingSystem.Data;usingSystem.Data.SqlClient;publicclassChangeTime{//Kernel32.dll在32位 查看详情

如何在 C++ 中实现这个结果?指向数组的数组

】如何在C++中实现这个结果?指向数组的数组【英文标题】:HowcanIachievethisresultinc++?Arrayspointingtoarrays【发布时间】:2015-02-0810:14:31【问题描述】:我正在尝试使用c/c++执行以下操作。为了解释代码应该如何工作,我编写了这个示... 查看详情

在 Array Adapter 中实现 Filterable 不会过滤任何结果 - 与过滤前相同的列表

】在ArrayAdapter中实现Filterable不会过滤任何结果-与过滤前相同的列表【英文标题】:ImplementingFilterableinArrayAdapterisnotfilteringanyresults-samelistasbeforefiltering【发布时间】:2018-10-1321:33:49【问题描述】:这是我第一次在我的代码中实现Fi... 查看详情

尝试在 Reactjs 中实现一个简单的承诺

】尝试在Reactjs中实现一个简单的承诺【英文标题】:TryingtoimplementaSIMPLEpromiseinReactjs【发布时间】:2017-02-2302:25:30【问题描述】:刚刚在React中首次尝试Promises。我有一个基本的承诺(从别人的代码中提取),但不知道如何使它变... 查看详情

在 SQL 中减去毫秒时出现意外结果 [重复]

】在SQL中减去毫秒时出现意外结果[重复]【英文标题】:UnexpectedresultswhensubtractingmillisecondsinSQL[duplicate]【发布时间】:2019-04-1210:53:25【问题描述】:我正在尝试在SQL中执行一些DateTime逻辑:SET@DayEnd=DATEADD(MILLISECOND,-1,@BeginNextDay)例... 查看详情