Pygame + OpenGL - 如何在 glBegin() 之后绘制文本?

Pygame + OpenGL - how to draw text after glBegin()?

我在 Whosebug 的某处找到了这种跨平台的文本绘制方式:

def drawText(x, y, text):                                                
    position = (x, y, 0)                                                       
    font = pygame.font.Font(None, 64)                                          
    textSurface = font.render(text, True, (255,255,255,255),                   
                              (0,0,0,255))                                     
    textData = pygame.image.tostring(textSurface, "RGBA", True)                
    GL.glRasterPos3d(*position)                                                
    GL.glDrawPixels(textSurface.get_width(), textSurface.get_height(),         
                    GL.GL_RGBA, GL.GL_UNSIGNED_BYTE, textData)                 

问题是我在调用glBegin(GL_QUADS)后无法调用drawText。我怎样才能创建一个矩形并用文本的内容对其进行纹理处理,然后显示它以便即使在 glBegin 之后也可以调用此 drawText?

我发现我无法更改 glBegin 中的当前纹理,因此我不得不重新设计部分代码。下面是使用 pygame 创建纹理的示例,基于 Python 版本的 Nehe 教程,第 6 课:

#!/usr/bin/env python

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

ESCAPE = '3'
window = 0
texture = 0

A_TEX_NUMBER = None
B_TEX_NUMBER = None

def GenTextureForText(text):
    font = pygame.font.Font(None, 64)
    textSurface = font.render(text, True, (255,255,255,255),
                              (0,0,0,255))
    ix, iy = textSurface.get_width(), textSurface.get_height()
    image = pygame.image.tostring(textSurface, "RGBX", True)
    glPixelStorei(GL_UNPACK_ALIGNMENT,1)
    i = glGenTextures(1)
    glBindTexture(GL_TEXTURE_2D, i)
    glTexImage2D(GL_TEXTURE_2D, 0, 3, ix, iy, 0, GL_RGBA, GL_UNSIGNED_BYTE, image)
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL)
    return i

def InitGL(Width, Height):
    global A_TEX_NUMBER, B_TEX_NUMBER
    pygame.init()
    A_TEX_NUMBER = GenTextureForText("a")
    B_TEX_NUMBER = GenTextureForText("b")
    glEnable(GL_TEXTURE_2D)
    glClearColor(0.0, 0.0, 0.0, 0.0)
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    gluPerspective(45.0, float(Width)/float(Height), 0.1, 100.0)
    glMatrixMode(GL_MODELVIEW)
    done = 1

def DrawGLScene():

  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
  glLoadIdentity()
  glTranslatef(0.0,0.0,-10.0)
  glBindTexture(GL_TEXTURE_2D, B_TEX_NUMBER)
  glBegin(GL_QUADS)
  glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, -1.0,  1.0)
  glTexCoord2f(1.0, 0.0); glVertex3f( 1.0, -1.0,  1.0)
  glTexCoord2f(1.0, 1.0); glVertex3f( 1.0,  1.0,  1.0)
  glTexCoord2f(0.0, 1.0); glVertex3f(-1.0,  1.0,  1.0)
  glEnd()
  glutSwapBuffers()

def keyPressed(*args):
    if args[0] == ESCAPE:
      glutDestroyWindow(window)
      sys.exit()

def main():
  global window
  glutInit("")
  glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_ALPHA | GLUT_DEPTH)
  glutInitWindowSize(640, 480)
  glutInitWindowPosition(0, 0)
  window = glutCreateWindow("Jeff Molofee's GL Code Tutorial ... NeHe '99")
  glutDisplayFunc(DrawGLScene)
  glutIdleFunc(DrawGLScene)
  glutKeyboardFunc(keyPressed)
  InitGL(640, 480)
  glutMainLoop()
print "Hit ESC key to quit."
main()