如何在python中的OpenGL中渲染文本?

时间:2019-07-06 22:18:56

标签: python opengl glut opengl-compat

我正在尝试使用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 个答案:

答案 0 :(得分:1)

您必须通过The OpenGL Utility Toolkit (GLUT)初始化glutInit
如果您使用PyGame,则无法呼叫glutSwapBuffers。使用 GLUT ,通过glutCreateWindow创建一个窗口并通过glutSwapBuffers进行显示更新,或者使用 PYGame 并通过{{3}更新显示} / pygame.display.flip()。不能混合使用窗口工具包。

一个最小的应用程序,它会创建 PyGame 窗口并通过pygame.display.update()绘制文本,如下所示:

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()

在上面的示例中,我使用glutBitmapCharacter而不是glWindowPos,因为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()