1

我正在尝试实现像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);

你能给我一些建议吗?

4

2 回答 2

3

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

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

于 2012-09-06T07:46:53.733 回答
1

我想你在之后。如果你需要通过 GLSL 实现各种 Photoshop 之类的混合模式,也可以看看这篇文章。与使用着色器相比,使用硬件混合非常有限。

于 2012-09-06T06:26:52.060 回答