Как сделать текст в OpenGL в Python? - PullRequest
1 голос
/ 07 июля 2019

Я пытаюсь использовать glutBitmapCharacter для рендеринга текста в моей программе, но ввод шрифта не определен и постоянно возникает ошибка, которая говорит, что GLUT_BITMAP_9_BY_15 не определено. Может кто-нибудь помочь мне с этим вопросом?

Код:

def glut_print(self, x, y, text):

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    gluOrtho2D(0.0, 1.0, 0.0, 1.0)
    glMatrixMode(GL_MODELVIEW)

    glColor3f(1, 1, 1)
    glRasterPos2f(x, y)
    for ch in text:
        glutBitmapCharacter(GLUT_BITMAP_9_BY_15, ctypes.c_int(ord(ch)))

    glutSwapBuffers()

1 Ответ

1 голос
/ 07 июля 2019

Вам нужно инициализировать служебный инструментарий OpenGL (GLUT) с помощью glutInit.
Если вы используете PyGame , то вы не сможете позвонить glutSwapBuffers. Либо используйте GLUT , создайте окно с помощью glutCreateWindow и обновите отображение с помощью glutSwapBuffers, либо используйте PYGame и обновите отображение с помощью pygame.display.flip() / pygame.display.update(). Невозможно смешать оконные наборы инструментов.

Минимальное приложение, которое создает PyGame окно и рисует текст по glutBitmapCharacter, может выглядеть следующим образом:

import pygame
from pygame.locals import *

from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *

def glut_print(x, y, text):

    glColor3f(1, 1, 1)
    glWindowPos2f(x, y)
    for ch in text:
        glutBitmapCharacter(GLUT_BITMAP_9_BY_15, ctypes.c_int(ord(ch)))


# init pygame
pygame.init()
displaySize = (640, 480)
screen = pygame.display.set_mode(displaySize, DOUBLEBUF | OPENGL)

# init glut
glutInit()

run = True
while run:

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    glut_print(displaySize[0]/2, displaySize[1]/2, "test")

    pygame.display.flip()

pygame.quit()

В приведенном выше примере я использовал glWindowPos вместо glRasterPos, потому что координаты glRasterPos преобразуются текущим представлением модели и проекционная матрица.
То же самое при использовании glRasterPos может выглядеть следующим образом:

def glut_print(x, y, text):

    # save and "clear" projection matirx
    glMatrixMode(GL_PROJECTION)
    glPushMatrix()
    glLoadIdentity()

    # set orthographic projection
    gluOrtho2D(0.0, displaySize[0], 0.0, displaySize[1])

    # save and "clear" model view matrix
    glMatrixMode(GL_MODELVIEW)
    glPushMatrix()
    glLoadIdentity()

    glColor3f(1, 1, 1)
    glRasterPos2f(x, y)
    for ch in text:
        glutBitmapCharacter(GLUT_BITMAP_9_BY_15, ctypes.c_int(ord(ch)))

    # restore projection matrix
    glMatrixMode(GL_PROJECTION)
    glPopMatrix()

    # restore model view matrix
    glMatrixMode(GL_MODELVIEW)
    glPopMatrix()
...