【问题标题】:mix RGBA pixmap with texture将 RGBA 像素图与纹理混合
【发布时间】:2014-12-29 15:21:29
【问题描述】:

我有一个 RGBA 像素图(例如,一个抗锯齿圆形 4x4 点),我想以类似于画笔描边的方式在纹理上绘制。使用glTexSubImage2D 的明显解决方案只是覆盖一个矩形区域,而不考虑 alpha 值。有没有比在本地 RAM 中维护纹理的镜像版本、在那里进行混合然后使用glTexSubImage2D 上传它——最好是基于 OpenGL/GPU 的更好的解决方案? FBO 是要走的路吗?

另外,在保持 1:1 图形质量(无伪影、插值等)和速度方面,是否使用 FBO 来实现这种效率?在 RAM 中使用 4x4 对象进行 CPU 混合基本上是用基本浮点算法转换 4x4 矩阵,总共有 16 次简单的数学迭代和 1 次 glTexSubImage2D 调用...正在设置 FBO,切换渲染上下文并进行渲染更快?

非常感谢基准数据,以及提出解决方案的 MVCE/伪代码。

注意: 不能为每个笔划创建单独的 alpha 混合四边形,这主要是因为使用的笔划数量非常多。 去科学吧!

【问题讨论】:

  • 亲爱的投票者:您愿意解释一下我的问题有什么问题吗?

标签: opengl textures alpha alphablending blending


【解决方案1】:

您可以使用framebuffer object (FBO) 渲染到纹理。

在您的程序开始时,创建一个 FBO 并将纹理附加到它。每当您需要绘制笔触时,绑定 FBO 并像在屏幕上绘制笔触一样绘制笔触(使用三角形)。笔画被写入附加的纹理。

对于您的主绘制循环,取消绑定 FBO,绑定附加的纹理,然后在整个屏幕上绘制一个四边形(从 -1,-1 到 1,1,不使用任何矩阵)。


此外,在保持 1:1 图形质量(无伪影、插值等)和速度方面,是否使用 FBO 来实现这种效率?

是的。

  • 如果附加的纹理与窗口一样大,则没有伪影。
  • 您只需要在添加新笔触时切换到 FBO,之后您就可以忘记笔触,因为它已经渲染到纹理上。
  • GPU 完成了所有的采样、插值、混合等工作,而且它比 CPU 好很多(毕竟,GPU 就是为此而设计的)
  • 切换 FBO 并不那么昂贵。现代游戏可以在每帧多次切换 FBO 以进行渲染到纹理,同时仍会输出数千个三角形;即使在移动平台上,每帧一个 FBO 开关也不会杀死 2D 应用。

【讨论】:

  • 我已经决定采用你的方法,上校——还有一件事让我很头疼……我希望在纹理中添加 alpha 混合的笔触——是否可以将 FBO 用作提供的纹理本身渲染还是我应该为此使用 2 个纹理和/或 2 个 FBO?不是“在自身上绘制纹理”UB吗?如果是这样,你能找到任何硬性参考吗?
猜你喜欢
  • 1970-01-01
  • 2021-09-08
  • 1970-01-01
  • 2014-08-25
  • 2011-02-22
  • 1970-01-01
  • 1970-01-01
  • 2010-11-09
  • 1970-01-01
相关资源
最近更新 更多