在 WebGL 中与 HTML 背景混合

2024-03-03

我正在将平面颜色和纹理绘制到 WebGL 画布中。我的颜色和纹理具有不同的 alpha 值,我希望它们能够正确混合。我想要透明背景(它们应该与画布下的 HTML 内容混合)。

在 WebGL 中,我使用

gl.clearColor(0, 0, 0, 0);
gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);
gl.enable(gl.BLEND);

当 HTML 背景为黑色时,它可以正常工作。但是当我将 JPG 图案设置为 的背景时,我绘制黑色三角形(alpha=1)和白色三角形(alpha=0.5),我可以在三角形彼此相交的位置看到背景图案。这是正确的行为吗?


gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA)意味着生成的 alpha 是

A_final = A_s * A_s + (1 - A_s) * A_d

在您的示例中,绘制黑色三角形(alpha=1)后,帧缓冲区中绘制的像素的 alpha 将为

1 * 1 + (1 - 1) * 0 == 1 + 0 == 1

所以它将是完全不透明的。接下来,绘制白色三角形(alpha=0.5)后,两个三角形相交处的像素的 alpha 将为

.5 * .5 + (1 - .5) * 1 == .25 + .5 == .75

这意味着最终颜色将被视为部分透明,并且当它与页面合成时,页面背景将显示出来。

这在常规 OpenGL 中是一个不太常见的问题,因为内容通常是在空背景下合成的。不过,当您绘制 FBO 并且必须将结果与上下文中的其他内容合成时,它确实会出现。有几种方法可以解决这个问题。

一种方法是让你的 alpha 与gl.ONE, gl.ONE_MINUS_SRC_ALPHA所以你得到

A_final = A_s + (1 - A_s) * A_d

这就是您通常想要的 alpha 混合效果。但是,您希望颜色仍然与gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA。您可以使用gl.blendFuncSeparate http://www.khronos.org/opengles/sdk/docs/man/xhtml/glBlendFuncSeparate.xml代替gl.blendFunc分别设置颜色混合和 Alpha 混合功能。在这种情况下,您可以调用

gl.BlendFuncSeparate(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA);

另一种选择是利用带有预乘 alpha 的颜色(WebGL 实际上已经假设您正在使用 http://www.khronos.org/registry/webgl/specs/latest/#5.2,例如,从纹理中采样颜色时)。如果你用已经乘以颜色的 alpha 绘制第二个三角形(因此半透明的白色三角形将具有gl_FragColor set to vec4(.5, .5, .5, .5)),然后就可以使用混合模式

gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA)

它会按照您想要的颜色和 Alpha 进行操作。

第二个选项是您在 WebGL 示例中常见的选项,因为(如前所述),WebGL 已经假设您的颜色已预乘(因此vec4(1., 1., 1., .5)超出色域,渲染输出未定义,驱动程序/GPU 可以输出它想要的任何疯狂的颜色)。更常见的是gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA)在常规 OpenGL 示例中,这会导致一些混乱。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 WebGL 中与 HTML 背景混合 的相关文章

随机推荐

  • ReferenceError:Rx 未定义

    我刚刚开始学习 Angular2 我正在尝试使用 Angular2 做 RxJ 示例 如果有人帮助我 我将不胜感激 RxJs 代码 var obs Rx Observable interval 500 take 5 do i gt cons
  • Linq 到对象

    我有两个来自不同服务器的数据库 我无法链接数据库 从数据库中检索数据如下 DB1 Client ID Engagement ID 启用说明 600 10 真实公司1 600 20 虚假公司2 700 10 真实公司3 DB2 Client
  • Fortran 95 数组中具有一维变量的二维数组

    我想在代码中将一些内容存储在二维数组中 然后想扫描该数组 有N 1 行 第一个索引的数量 比如说i 在数组中 然而 对于给定值i 数量j尽管我知道最大可能值 但值不是固定的j 说它是N 2 我当然可以创建大小的数组 N 1 N 2 来存储我
  • IIS会回收asp.net core进程吗?

    我需要在我的 asp net core 应用程序中运行长时间运行的后台任务 我了解 Azure Webjobs 和其他进程外技术 但我宁愿保持解决方案简单并直接在 asp net core 进程中运行这些任务 我使用 Kestrel 该应用
  • 使 VSCodium 的 python 代码突出显示等于 VSCode

    因为 微软不好 而从 VSCode 迁移到 VSCodium 发展python应用程序似乎缺少一些代码颜色 例如 Dark 主题中绿松石色的模块或浅蓝色的局部变量 在下面的比较中可见 Left VSCodium Right VSCode 正
  • 如何在Android中读取彩信数据?

    我想读取彩信数据 我已经在中看到了零件表mmssms db彩信条目的存储位置 我正在使用光标 我想知道合适的URI 我正在使用 content mms sms conversations 并且列名称图像的 地址 发送至 文本 或 主题 和
  • 在 C# 中比较两个结构体的值

    我不是在寻找返回 bool 的两个结构的比较 我想知道是否有一种方法可以获取两个结构的哪些字段 相同的结构 但可能不同的值 是不同的 基本上我想要一种更简单的方法来执行以下操作 public class Diff public String
  • 如何将命令行参数从 pytest 传递到代码

    我正在尝试将参数从 pytest 测试用例传递到正在测试的模块 例如 使用 main pyPython 样板 https www python boilerplate com py3 argparse pytest 我可以从命令行运行它 p
  • 音频元素源的 HTML5 本地存储 - 可能吗?

    我最近一直在尝试 html5 的音频和本地存储功能 但遇到了一些让我困惑的事情 我希望能够在本地缓存或存储音频元素的源 以实现更快的离线播放 问题是我看不出当前的实现如何可能实现这一点 我使用 WebKit 尝试过以下操作 创建一个清单文件
  • Azure DocumentDB 十进制截断

    我目前正在使用 Azure DocumentDB 来存储带有价格的产品数据 几乎一切都工作得很好 但现在我遇到了一个问题 即从 DocumentDB 读取时我的小数 System Decimal 被截断 比如这个价格 Input Price
  • 如何使用带有StanfordCoreNLP prop 'ner'的序列化CRFClassifier

    我正在使用StanfordCoreNLP API 接口以编程方式执行一些基本的NLP 我需要在自己的语料库上训练模型 但我想使用StanfordCoreNLP界面来做到这一点 因为它在幕后处理许多干的机制 我在那里不需要太多的专业知识 我已
  • PHP中两个日期相减

    我在 php 中有两个日期 date1 May 3 2012 10 38 22 GMT date2 06 Apr 2012 07 22 21 GMT 然后我将它们都减去 date2 date1 并得到 Result 6 为什么结果是 6 而
  • R dplyr:在列中查找特定值,然后用该值替换右侧后续列中的相邻单元格

    我正在尝试创建一个地点和事件时间的矩阵 就我而言 一旦事件发生 1 它就是永久性的并且不能返回到 0 一旦列中的单元格为 1 我将尝试用 1 填充右侧后续列中的相邻单元格 请参见下面的示例 site lt c A B C D E F G s
  • 用于生成 HTML 标签的 PHP 库 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我是 PHP 新手 抱歉 如果这是常见问题解答 假设我有这个 HTML 表 table width 10
  • 在 Javascript 或 jQuery 中,如何仅删除第一个和最后一个标签?

    给定以下字符串 var htmlStr p class red 349dsa01 This is p p class blue saf9vsaz a test p 如何删除该字符串的第一个和最后一个标签 这将是结果 var htmlStr
  • 有关角度谷歌地图聚类选项的任何文档吗?

    您好 我正在使用此处提供的 Angular Google 地图库https github com nlaplante angular google maps https github com nlaplante angular google
  • Facebook:自动刷新长期访问令牌

    我正在为我的应用程序的用户存储长期访问令牌 这些用户已将其 Facebook 帐户与其关联 自灭亡以来离线访问代币 这些长期存在的代币的有效期为 大约 60 天 但是 当用户与 Facebook 交互时 它们可以自行刷新 根据文档 http
  • 如何在终端中创建换行符?

    我在最新的 Mac OSX 终端上使用 Python 当我按 Enter 时 它会处理我输入的代码 并且我无法弄清楚如何添加额外的代码行 例如对于基本循环 在 python shell 中 如果您正在键入允许继续的代码 则按一次 Enter
  • 非类型参数的模板参数必须是表达式

    为什么下面的代码是错误的 template
  • 在 WebGL 中与 HTML 背景混合

    我正在将平面颜色和纹理绘制到 WebGL 画布中 我的颜色和纹理具有不同的 alpha 值 我希望它们能够正确混合 我想要透明背景 它们应该与画布下的 HTML 内容混合 在 WebGL 中 我使用 gl clearColor 0 0 0