3

如何使用指定的附加 alpha 蒙版对纹理进行 blit?简单地说,我想做这样的事情:

例子

4

3 回答 3

3

不知何故,我怀疑您的驱动程序是否支持 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()
于 2012-01-11T20:21:23.937 回答
0

使用片段着色器最容易做到这一点:

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_ONE, GL_ONE_MINUS_SRC_ALPHA);,您就得到了您想要的。如果您不能或不想使用着色器,可以使用多重纹理和纹理组合器环境来完成:

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

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE);
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_TEXTURE0);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_ALPHA, GL_TEXTURE1);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_ALPHA);

然后你还必须处理纹理单元和其他模糊的状态开关。我个人更喜欢着色器。

于 2012-01-10T15:31:33.583 回答
0

在 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 时,它将显示启用了透明度。(它可能适用于两个单独的文件,但是当我测试它时,我使用了一个组合图像。)

查看上面的示例代码以获取更多详细信息。在其中,作者还画了一个棋盘格背景,透明效果更加明显。

于 2013-11-29T17:13:55.953 回答