Python pyglet:使用指定的alpha遮罩blit纹理

Python pyglet:使用指定的alpha遮罩blit纹理,python,opengl,pyglet,Python,Opengl,Pyglet,如何使用指定的附加alpha遮罩blit纹理?简单地说,我想做这样的事情: 这是使用片段着色器最容易实现的: uniform sampler2D image; uniform sampler2D mask; varying vec2 texcoord; void main() { gl_FragColor.a = texture2D(mask, texcoord); /* we use pre multiplied alpha */ gl_FragColor.rgb

如何使用指定的附加alpha遮罩blit纹理?简单地说,我想做这样的事情:


这是使用片段着色器最容易实现的:

uniform sampler2D image;
uniform sampler2D mask;

varying vec2 texcoord;

void main()
{
    gl_FragColor.a = texture2D(mask, texcoord);
    /* we use pre multiplied alpha */
    gl_FragColor.rgb = texture2D(image, texcoord) * gl_FragColor.a;
}
将其与
glBlendFunc(GL\u ONE,GL\u ONE\u减去SRC\u ALPHA)相结合你就得到了你想要的。如果不能或不想使用着色器,可以使用多重纹理和纹理组合器环境:

(自从我上次使用纹理组合器以来,已经有很长时间了,所以这可能会有一些错误):


然后你还必须处理纹理单位和其他模糊状态切换。就我个人而言,我更喜欢着色器。

如果FrameBufferObject扩展不提供着色器,但值得一试,我怀疑您的驱动程序是否支持该扩展。这并不是你想要的,所以,你可能最终必须使用
glTexEnv
,或者比我聪明一点,但这会对和图像应用遮罩,但实际上不会添加alpha值:

import pyglet
from pyglet.gl import *

window = pyglet.window.Window()
image = pyglet.resource.image('pic.jpg')
mask = pyglet.resource.image('mask.jpg')
createdtex=False;
imagetex = 0


@window.event
def on_draw():
    window.clear()
    global createdtex
    texfrmbuf =(GLuint*1)()
    global imagetex
    if createdtex!=True:
        imagetex = image.get_texture()
        glEnable(GL_BLEND)
        glBlendFunc(GL_ZERO, GL_SRC_COLOR)
        glGenFramebuffersEXT(1,texfrmbuf)
        glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT,texfrmbuf[0])
        glFramebufferTexture2DEXT(GL_DRAW_FRAMEBUFFER_EXT,GL_COLOR_ATTACHMENT0_EXT, imagetex.target,imagetex.id,0)
        mask.blit(0,0)
        glFlush()
        glDisable(GL_BLEND)
        glDeleteFramebuffersEXT(1,texfrmbuf)
        glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT,0)
        createdtex=True

    imagetex.blit(0,0)

pyglet.app.run()

在Pyglet中,有一种稍微简单的方法可以向图像添加alpha遮罩。基于此,您需要两件事

首先,这些线:

# Enable alpha blending, required for image.blit.
glEnable(GL_BLEND)
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
其次,您需要将图像和掩码合并到一个.png文件中。将遮罩放入Alpha通道(该通道由.png格式支持)。然后,当您对图像进行blit时,它将显示为启用透明度。(它可能适用于两个单独的文件,但当我测试它时,我使用了一个组合图像。)


查看上面的示例代码以了解更多详细信息。在其中,作者还绘制了棋盘格背景,因此透明度效果更加明显。

好女人,你认识她吗?;)只是开玩笑。你需要研究阿尔法混合。我还没有在pyglet中完成它,因此我无法提供有价值的帮助。除非您想在CPU或着色器中完成它,否则您需要这样做:
//绘制蒙版gl.glEnable(gl_BLEND);gl.glBlendFunc(gl_DST_COLOR,gl_ZERO)绘制第二张图片
,如果要在其他图片上渲染,请使用纹理作为渲染目标。另外,这位女士是著名的“丽娜”图片,在很多图像处理中使用papers@PeterT这似乎接近我想要的效果,但您能否解释一下如何使用纹理作为渲染目标执行此操作?我真的搞不懂。不幸的是,我的上网本的视频驱动程序根本不支持任何着色器,而到目前为止,多重文本对我来说是相当困难的。但如果我没有找到任何其他合适的解决方案,我最终会使用片段着色器。谢谢你的回答。虽然你的回答不是确切的答案,但我还是会接受的,因为你确实帮助我最终找到了正确的方法。这是工作代码:谢谢你和cocos2d的源代码帮助(:@Pevzi请随意将其作为你自己的答案发布并标记。如果你想奖励我,你可以随时投票给我。唉@MikhailSidorov,你的粘贴已经从网上消失了。你能给我一些提示吗?我有完全相同的问题。
# Enable alpha blending, required for image.blit.
glEnable(GL_BLEND)
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)