Невозможно нарисовать растровое изображение в формате GL_RGBA8
с помощью glBitmap
, поскольку буфер обрабатывается как буфер с форматом GL_COLOR_INDEX
(см. glTexImage2D
)
См. Спецификация профиля совместимости API OpenGL 4.6 - 14,8 битовых карт , стр. 579:
Как и полигональный шаблон, битовая карта распаковывается из памяти в соответствии спроцедура, приведенная в разделе 18.1 для DrawPixels;это как если бы ширина и высота, передаваемые этой команде, были равны w и h, соответственно, тип был BITMAP, а формат был COLOR_INDEX.
Если вы хотите нарисовать trexutre RGBA, то вам нужно создать буфер массива байтов.Это может быть достигнуто с помощью NumPy :
raw_data = img.get_buffer().raw
data = numpy.fromstring(raw_data, numpy.uint8)
Создать объект текстуры с помощью glTexImage2D
:
bitmap_tex = glGenTextures(1)
glBindTexture(GL_TEXTURE_2D, bitmap_tex)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,w,h,0,GL_BGRA,GL_UNSIGNED_BYTE,data)
и нарисовать текстуру Quads - Примитив :
glEnable(GL_TEXTURE_2D)
glBegin(GL_QUADS)
glTexCoord2f(0, 1)
glVertex2f(x, y)
glTexCoord2f(1, 1)
glVertex2f(x+w, y)
glTexCoord2f(1, 0)
glVertex2f(x+w, y+h)
glTexCoord2f(0, 0)
glVertex2f(x, y+h)
glEnd()
glDisable(GL_TEXTURE_2D)
Если текстура прозрачная, вам нужно активировать Blending .
Функция может быть реализована какследует:
bitmap_tex = None
def blit_image(x,y,img,r,g,b):
global bitmap_tex
# get texture data
w,h = img.get_size()
raw_data = img.get_buffer().raw
data = numpy.fromstring(raw_data, numpy.uint8)
# create texture object
if bitmap_tex == None:
bitmap_tex = glGenTextures(1)
glBindTexture(GL_TEXTURE_2D, bitmap_tex)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,w,h,0,GL_BGRA,GL_UNSIGNED_BYTE,data)
# save and set model view and projection matrix
glMatrixMode(GL_PROJECTION)
glPushMatrix()
glLoadIdentity()
glOrtho(0, display[0], 0, display[1], -1, 1)
glMatrixMode(GL_MODELVIEW)
glPushMatrix()
glLoadIdentity()
# enable blending
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
glEnable(GL_BLEND)
# draw textured quad
glColor3f(r,g,b)
glEnable(GL_TEXTURE_2D)
glBegin(GL_QUADS)
glTexCoord2f(0, 1)
glVertex2f(x, y)
glTexCoord2f(1, 1)
glVertex2f(x+w, y)
glTexCoord2f(1, 0)
glVertex2f(x+w, y+h)
glTexCoord2f(0, 0)
glVertex2f(x, y+h)
glEnd()
glDisable(GL_TEXTURE_2D)
# restore matrices
glMatrixMode(GL_PROJECTION)
glPopMatrix()
glMatrixMode(GL_MODELVIEW)
glPopMatrix()
# disable blending
glDisable(GL_BLEND)
pauseimg = pygame.image.load(path + "pause.png").convert_alpha()
blit_image(300,300,pauseimg,1,1,1)