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

Python 为什么glDrawpixels不渲染我的透明背景?,python,opengl,python-imaging-library,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("RG

我想用透明的背景在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)

干杯,还不完全清楚你想干什么。您可以尝试在其他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()渲染到窗口。

在开始时添加了此选项

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        )

默认情况下,窗口系统就是这样工作的。如果您想要透明,您需要一个支持透明窗口的操作系统和WM(例如windows&DWM/Aero),然后您可以创建一个新的透明窗口,将OpenGL内容渲染到帧缓冲区,将像素读回RAM,并将其blit到窗口中,避免透明像素。我不知道如何详细地实现这一点,而且实现起来可能会非常复杂,特别是如果您需要跨平台支持的话。真的没有其他方法可以做到这一点。。。。也许吧,但您的代码似乎不可移植……最后,我的代码可以在linux、win32平台之间工作并可移植。。在使用之前,我必须检查混合是否可用。谢谢你的帮助。。。这意味着您实际上想做的第一件事(透明字体胜过使用OpenGL渲染的其他东西),而不是我解释的那件事(透明窗口)。下次尽量详细说明你的问题。所以,如果你写下自己的答案并接受它,这将是一件好事,这样这个问题就结束了,与你有类似问题的人知道解决方案。