将RGBA像素图与纹理混合

时间:2014-12-29 15:21:30

标签: opengl textures alpha alphablending blending

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

另外,在维持1:1图形质量(无伪像,插值等)和速度方面,使用FBO是否有效?使用RAM中的4x4对象进行CPU混合基本上是使用基本的浮点算法转换4x4矩阵,总共16个简单的数学迭代& 1 glTexSubImage2D调用...正在设置FBO,切换渲染上下文&还能更快地完成渲染吗?

基准测试数据非常赞赏,以及建议解决方案的MVCE /伪代码。

注意:为每个笔划创建单独的alpha混合四边形不是一种选择,主要是因为使用了非常多的笔划。 走科学!

1 个答案:

答案 0 :(得分:2)

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

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

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


  

另外,在维持1:1图形质量(无伪像,插值等)和速度方面,使用FBO是否有效?

  • 如果附加的纹理与窗口一样大,则没有任何文物。
  • 您只需在添加新笔划时切换到FBO,之后您就可以忘记笔划,因为它已经渲染到纹理。
  • GPU完成所有的采样,插值,混合等操作,并且它比CPU更好 (毕竟,这是GPU的设计)
  • 切换FBO不是 昂贵。现代游戏可以在一帧中多次切换FBO渲染到纹理,同时仍然抽出数千个三角形;即使在移动平台上,每帧一个FBO开关也不会杀死2D应用程序。