2012-09-06 51 views
1

我试图实现像Photoshop一样的图层功能。 这里是我想画什么..OpenGL多纹理混合

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); 

能给我一些建议吗?

回答

1

我认为你是在this之后。如果你需要通过GLSL实现各种类似Photoshop的混合模式,请参考this文章。与使用着色器相比,使用硬件混合相当有限。

3

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

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

+0

Yno,我个人实现了所有使用3 FBO的着色器中的Photoshop混合模式。完全没有任何纯粹的性能。但这对于OpenGL初学者来说并不容易。 :) –

+0

你能告诉我提示吗?或示例代码,这将是很大的帮助 –