Почему glDrawpixels не отображает мой прозрачный фон? - PullRequest
0 голосов
/ 02 февраля 2012

Я хочу сделать шрифт в 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 голосов
/ 07 февраля 2013

добавил это в начале

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        )
0 голосов
/ 08 февраля 2012

ура, не совсем понятно, что вы пытаетесь достичь. Вы можете либо пытаться сделать прозрачный шрифт поверх какой-либо другой геометрии 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, объект framebuffer), затем используйте glReadPixels () для копирования вывод, а затем снова используйте BitBlt () для отображения результатов с использованием GDI. В вашем случае, когда вы пытаетесь отобразить фрагмент текста, вам может быть лучше без использования OpenGL.

Итак, в вашем примере вы могли бы сделать черный цвет прозрачным, т.е. x = y = z = 0, не использовать OpenGL и создать вместо него растровое изображение, не зависящее от устройства (DIB), используя CreateDIBSection (), заполнить его изображением вместо передача его в glDrawPixels () и рендеринг в окно с помощью BitBlt ().

...