OpenGL多重纹理混合

时间:2012-09-06 05:45:06

标签: opengl shader fragment blend

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

http://s19.postimage.org/6n8eejbkz/image.png

但它如下所示

http://s19.postimage.org/hpdhcz5nn/image.png

它使用两层。用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);
你可以给我一些建议吗?

2 个答案:

答案 0 :(得分:3)

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

您可能会考虑使用两种纹理,一种用于阅读,另一种用于书写。应用刷子后,切换它们。

答案 1 :(得分:1)

我认为你在this之后。如果你需要通过GLSL实现各种类似Photoshop的混合模式,请查看this文章。使用硬件混合相比,你可以使用着色器。