为什么glDrawpixels不会渲染我的透明背景?

时间:2012-02-02 10:59:41

标签: python opengl python-imaging-library

我想用透明背景渲染opengl中的字体。 主要问题是我的背景总是不透明的黑色!

这是我的代码:

glEnable(GL_BLEND)
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
font = ImageFont.truetype("/usr/share/fonts/truetype/wqy/wqy-microhei.ttc", 16)
textsize = font.getsize(u"当前运行列表")
im = Image.new("RGB",textsize,"#000")
draw = ImageDraw.Draw(im)
transparent_area = (0,0,im.size[0],im.size[1])
mask=Image.new('L', im.size, color=0)   
drawmask = ImageDraw.Draw(mask)
drawmask.rectangle(transparent_area, fill=0)
im.putalpha(mask)
draw.text((0,0), u"当前运行列表", font=font, fill="red")
#im.save('render.png')
ix, iy, image = im.size[0], im.size[1], im.tostring("raw", "RGBA", 0, -1)
glDrawPixels(ix,iy,GL_RGBA,GL_UNSIGNED_BYTE,image)

2 个答案:

答案 0 :(得分:0)

干杯,目前还不完全清楚你想要实现什么目标。您可以尝试在其他OpenGL几何体上渲染透明字体,也可以使用OpenGL渲染窗口内容,并使窗口的某些部分透明(这样您就可以看到窗口背后的窗口)。

要使窗口透明,您需要使用:

// Set WS_EX_LAYERED on this window 
SetWindowLong(hwnd, 
          GWL_EXSTYLE, 
          GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_LAYERED);

// Make this window transparent
int transparentColor = RGB(x, y, z);
SetLayeredWindowAttributes(hwnd, transparentColor, 255, LWA_COLORKEY);

这可以在窗口上实现所谓的颜色键控,这意味着使用RGB(x,y,z)渲染的任何内容都会变得透明,并且窗口在这些部分中不可见。请注意,此透明度是二进制的,它是完全透明的或完全不透明的。此外,您需要使用GDI渲染到您的窗口。这意味着要么根本不使用OpenGL,要么使用像BitBlt()或StretchBlt()这样的函数,或者使用OpenGL渲染到P缓冲区(或者放入FBO,帧缓冲区对象),然后使用glReadPixels()来复制输出,然后再次使用BitBlt()使用GDI显示结果。在您尝试渲染文本的情况下,不使用OpenGL可能会更好。

因此,在您的示例中,您可以使黑色透明,即x = y = z = 0,不使用OpenGL,并使用CreateDIBSection()创建设备无关位图(DIB),用图像填充它而不是将它传递给glDrawPixels()并使用BitBlt()渲染到窗口。

答案 1 :(得分:0)

在开头添加了这个

glPixelStorei( GL_UNPACK_SWAP_BYTES,  GL_FALSE )
glPixelStorei( GL_UNPACK_LSB_FIRST,   GL_FALSE )
glPixelStorei( GL_UNPACK_ROW_LENGTH,  0        )
glPixelStorei( GL_UNPACK_SKIP_ROWS,   0        )
glPixelStorei( GL_UNPACK_SKIP_PIXELS, 0        )
glPixelStorei( GL_UNPACK_ALIGNMENT,   1        )