OpenGL 多纹理混合

Posted

技术标签:

【中文标题】OpenGL 多纹理混合【英文标题】:OpenGL multitexture blending 【发布时间】:2012-09-06 05:45:06 【问题描述】:

我正在尝试实现像 Photoshop 这样的图层功能。 这是我想画的..

但它是像下面这样绘制的

它使用了两层。用 2 个纹理帧缓冲区制作 一个用于背景,另一个用于绘图。 纹理与片段着色器混合。

mediump  vec4 tex0_color = texture2D(texunit0,TexCoordOut);  // bg texture
mediump  vec4 tex1_color = texture2D(texunit1,TexCoordOut);  // drawing texture 
mediump  vec4 mix_color  = mix(tex0_color,tex1_color,tex1_color.a);

并且在绘图层上的每次绘制都是使用顶点精灵执行的

highp float a = DestinationColor.a * texture2D(texunit0,gl_PointCoord).a;
gl_FragColor  = vec4(DestinationColor.rgb,a);

和混合功能设置如下..

glEnable    (GL_BLEND);
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

你能给我一些建议吗?

【问题讨论】:

【参考方案1】:

不让着色器执行混合操作,因为它需要读取和写入目标纹理,这只能同步完成,导致性能非常差。这种同步目前只能在不可编程的管道中实现。

您可以考虑使用两种纹理,一种用于阅读,另一种用于书写。应用画笔后,切换它们。

【讨论】:

是的,我个人使用 3 个 FBO 在着色器中实现了所有 Photoshop 混合模式。根本没有纯粹的性能。但这对于 OpenGL 初学者来说并不容易。 :) 你能给我提示一下吗?或示例代码会很有帮助【参考方案2】:

我认为您正在关注this。如果您需要通过 GLSL 实现各种 Photoshop 之类的混合模式,请查看 this 文章。与您可以使用的功能相比,使用硬件混合非常有限着色器。

【讨论】:

以上是关于OpenGL 多纹理混合的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL GLSL 通过任意形状混合两个纹理

OpenGL 在单色上混合颜色

GLSL 多纹理 - 混合纹理

OpenGL渲染到纹理透明度问题

OpenGL:纹理基元 + 高帧率

OpenGL 多线程共享纹理