如何通过指定额外的alpha蒙版来渲染纹理?简单地说,我想做这样的事情:
答案 0 :(得分: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()
答案 1 :(得分: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);
然后你还需要处理纹理单元和其他模糊的状态开关。我个人更喜欢着色器。
答案 2 :(得分:0)
在Pyglet中,有一种稍微简单的方法可以为图像添加alpha蒙版。基于this sample code for displaying an image,您需要两件事。
首先,这些行:
# Enable alpha blending, required for image.blit.
glEnable(GL_BLEND)
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
其次,您需要将图像和蒙版合并到一个.png文件中。将掩码放入Alpha通道(.png格式支持)。然后当您对图像进行blit时,它将显示为启用透明度。 (它可能适用于两个单独的文件,但是当我测试它时,我使用单个组合图像。)
查看上面的示例代码以获取更多详细信息。在其中,作者还绘制了棋盘背景,因此透明效果更加明显。