- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一款 LibGDX 游戏,其中有平滑渐变的卡通云。游戏中还有其他渐变示例也存在类似问题,但云彩是最明显的示例。它们在 Android、iOS 和游戏的桌面版本中看起来不错,但在 WebGL 版本中,渐变绘制得不那么平滑。似乎只有 alpha 梯度有问题。其他渐变看起来还不错。
我在 Chrome 和 IE 中尝试了 3 种不同的设备,所有 3 种设备都产生了相同的结果。您可以在此处找到 HTML5 版本的测试。
https://wordbuzzhtml5.appspot.com/canvas/
我在 github 上添加了一个示例 IntelliJ 项目
https://github.com/WillCalderwood/CloudTest
如果您有 intelliJ,请克隆该项目,打开 build.gradle 文件,按 Alt-F12,键入 gradlew html:superdev
,然后浏览至 http://localhost:8080/html/
关键代码是render()
here
这里底部的图像是桌面版本,顶部是 WebGL 版本,两者运行在相同的硬件上。
这幅画没有任何巧妙之处。这只是一个调用
spriteBatch.draw(texture, getLeft(), getBottom(), getWidth(), getHeight());
我正在使用默认着色器,纹理包含预乘 alpha,混合函数设置为
spriteBatch.setBlendFunction(GL20.GL_ONE, GL20.GL_ONE_MINUS_SRC_ALPHA);
这是实际图像,尽管 alpha 没有像我的打包程序那样预乘。
有谁知道这可能的原因以及我该如何解决?
更新
这似乎只有在使用混合模式 GL20.GL_ONE, GL20.GL_ONE_MINUS_SRC_ALPHA
时才会发生
另一个更新
我试过将整个游戏更改为使用非预乘 alpha 纹理。我使用 Texture Packer,它可以帮助修复非预乘 alpha 经常出现的光晕问题。所有这些在 Android 和桌面版本中都运行良好。在 WebGL 版本中,虽然我得到了平滑的渐变,但我仍然得到了一个小的光晕效果,所以我也不能用它作为解决方案。
还有另一个更新
这是一张新图片。桌面版在上,网页版在下。左边的混合模式 GL20.GL_ONE, GL20.GL_ONE_MINUS_SRC_ALPHA
右边的 GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA
这是左下角图像的放大版本,通过增加对比度来显示问题。
我还对片段着色器做了很多尝试,以尝试弄清楚发生了什么。如果我设置
gl_FragColor = vec4(c.a, c.a, c.a, 1.0);
那么渐变是平滑的,但是如果我设置
gl_FragColor = vec4(c.r, c.r, c.r, 1.0);
然后我得到 strip 。我认为这指向一个精度问题,因为颜色 channel 已被预乘过程挤压到光谱的较暗端。
最佳答案
WebGL 对待 alpha 的方式与标准 OpenGL 略有不同,并且经常会导致问题。
This site很好地解释了差异。
The biggest difference between OpenGL and WebGL is that OpenGL renders to a backbuffer that is not composited with anything so, or effectively not composited with anything by the OS's window manager, so it doesn't matter what your alpha is.
WebGL is composited by the browser with the web page and the default is to use pre-multiplied alpha the same as .png tags with transparency and 2d canvas tags.*
该站点还针对人们面临的典型问题提供了解决方法。这有点复杂,但应该可以解决您的问题。
我不打算在这里粘贴整篇文章,但我怀疑您最好坚持使用非预乘,并确保在每次渲染后清除 alpha channel 。该网站提供了更多详细信息。
关于html - 使用预乘 alpha 时,WebGL 中的 Alpha 渐变不平滑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31481029/
我正在阅读哈德利的 Advanced R并尝试一些东西。我正在尝试创建一个 lazy闭包函数返回一个带有提供的函数 data.frame在其环境中以及使用 with并且能够在以后提供额外的函数参数。
我有两个 ViewController。初始 ViewController 是输入和存储 URL 的地方。此初始 ViewController 的 viewDidLoad 还应该在应用程序启动时开始加
你是怎么用的 对于应用程序中的 ListView 项也应该在设备 <11 上运行? 由于 activated_state 在 HC 之前不可用,我只能想到两个肮脏的解决方法: 在您的 Activit
我正在为 android (2.1 > 3.1) 编写一个应用程序,我想使用熟悉的做法,即在 Honeycomb 应用程序中使用应用程序图标来进入家庭 Activity ,但是,当我之前运行该 Act
如果搜索的键不存在,我如何覆盖方法 GET 或编写一个将在服务器端执行的新函数返回另一个键值? 示例: 如果关键字“word_1 word_2 word_3 word_4”不存在则搜索关键字“word
对于我的存储库,我使用的是 Git 和 Stash。在 Stash 端,我限制了(只读)对 master 的访问权限,因此任何用户都可以从 master 分支分支以获取功能/分支,但不能直接 merg
如何配置dgrid及其存储以定义渲染行时是否已经选择了行? 例如,如果我的行数据是这样的: { id: 1, name: 'Item Name', selected: true } 我当前
有没有一种方法可以将变量从一个 BeanShell 前/后处理器引用到另一个 BeanShell 处理器(它们在同一个线程组中)? 如果我在 HTTP 请求下的 BeanShell 预处理器中创建了一
问题 我已尝试添加预操作 shell 脚本,这些脚本会根据我正在构建的内容打开/关闭我的 .pch 文件中的某些定义。 但是,在运行构建时,没有任何反应。我不是一个流利的 shell 脚本编写者,所以
我有一个 HTML 字符串用作 jQuery 输入文档。 // the variable html contains the HTML code jQuery( html ).find( 'p' ).
在 Mercurial 中允许 merge 之前有没有办法进行一些检查? 通过将以下内容添加到 ~/.hg/hgrc,我找到了更新前 Hook ,并拥有一个在允许更新之前运行的脚本: [hooks]
总结: 预 Controller Hook 是否在缓存期间执行?是否有任何 Hook 点可以执行? (系统前?) 我应该强调一个事实,即 Hook 不会影响发送到浏览器的内容。这不是问题。 详细版:
我正在使用适用于 android 的 Skobbler Map API,到目前为止它一直非常好。按照官方的“操作方法”,我已经能够将 map 应用到我的应用程序中。比我可以让应用程序下载 map 并离
当我安装bcrypt时我的 hapi js 项目的模块尚未安装,它显示类似 node-pre-gyp install --fallback-to-build 我尝试通过运行来安装; npm i nod
我试图使用此代码的变体: apply plugin: 'java' apply plugin: 'idea' idea.workspace.iws.withXml { provider ->
假设我们有一个 PHP 项目,其依赖项 A 和 B 分别依赖于 PHP 库 X,但版本不同。 通常,人们会使用诸如 composer 之类的 PHP 依赖管理器,它可以通过在与 A 和 B 兼容的版本
这似乎违背了代码块的目的,但我希望能够在代码块中加粗。例如,如果我想将返回行加粗: int main(void) { **return 0;** } 最佳答案 您必须在 HTML 中执行此操作
我们是否应该使用 Huggingface(预)训练一个 BERT 无框模型的小写输入数据?我查看了 Thomas Wolf ( https://github.com/huggingface/trans
我有两个模式: 技能: var mongoose = require("mongoose"); var SkillSchema = new mongoose.Schema({ skill: {
我这里有问题。这适用于 Chrome,但我无法在 IE11 的 index.html 中使用任何动画。当它不想工作时,我会看到一个静态屏幕。同样在 IE 中,消息不会像它应该的那样消失。如果我将 di
我是一名优秀的程序员,十分优秀!