为了便于解释,我将使用与freetype-py-0.4.1一起使用的示例“opengl.py”(最后只有少量编辑,我更改了字体):
#!/usr/bin/env python
import numpy
from freetype import *
import OpenGL.GL as gl
import OpenGL.GLUT as glut
base, texid = 0, 0
text = '''Hello World !'''
def on_display( ):
global texid
gl.glClearColor(1,1,1,1)
gl.glClear(gl.GL_COLOR_BUFFER_BIT | gl.GL_DEPTH_BUFFER_BIT)
gl.glBindTexture( gl.GL_TEXTURE_2D, texid )
gl.glColor(0,0,0,1)
gl.glPushMatrix( )
gl.glTranslate( 10, 100, 0 )
gl.glPushMatrix( )
gl.glListBase( base+1 )
gl.glCallLists( [ord(c) for c in text] )
gl.glPopMatrix( )
gl.glPopMatrix( )
glut.glutSwapBuffers( )
def on_reshape( width, height ):
gl.glViewport( 0, 0, width, height )
gl.glMatrixMode( gl.GL_PROJECTION )
gl.glLoadIdentity( )
gl.glOrtho( 0, width, 0, height, -1, 1 )
gl.glMatrixMode( gl.GL_MODELVIEW )
gl.glLoadIdentity( )
def on_keyboard( key, x, y ):
if key == '\033': sys.exit( )
def makefont(filename, size):
global texid
# Load font and check it is monotype
face = Face(filename)
face.set_char_size( size*64 )
if not face.is_fixed_width:
raise 'Font is not monotype'
# Determine largest glyph size
width, height, ascender, descender = 0, 0, 0, 0
for c in range(32,128):
face.load_char( chr(c), FT_LOAD_RENDER | FT_LOAD_FORCE_AUTOHINT )
bitmap = face.glyph.bitmap
width = max( width, bitmap.width )
ascender = max( ascender, face.glyph.bitmap_top )
descender = max( descender, bitmap.rows-face.glyph.bitmap_top )
height = ascender+descender
# Generate texture data
Z = numpy.zeros((height*6, width*16), dtype=numpy.ubyte)
for j in range(6):
for i in range(16):
face.load_char(chr(32+j*16+i), FT_LOAD_RENDER | FT_LOAD_FORCE_AUTOHINT )
bitmap = face.glyph.bitmap
x = i*width + face.glyph.bitmap_left
y = j*height + ascender - face.glyph.bitmap_top
Z[y:y+bitmap.rows,x:x+bitmap.width].flat = bitmap.buffer
# Bound texture
texid = gl.glGenTextures(1)
gl.glBindTexture( gl.GL_TEXTURE_2D, texid )
gl.glTexParameterf( gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MAG_FILTER, gl.GL_LINEAR )
gl.glTexParameterf( gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MIN_FILTER, gl.GL_LINEAR )
gl.glTexImage2D( gl.GL_TEXTURE_2D, 0, gl.GL_ALPHA, Z.shape[1], Z.shape[0], 0,
gl.GL_ALPHA, gl.GL_UNSIGNED_BYTE, Z )
# Generate display lists
dx, dy = width/float(Z.shape[1]), height/float(Z.shape[0])
base = gl.glGenLists(8*16)
for i in range(8*16):
c = chr(i)
x = i%16
y = i//16-2
gl.glNewList(base+i, gl.GL_COMPILE)
if (c == '\n'):
gl.glPopMatrix( )
gl.glTranslatef( 0, -height, 0 )
gl.glPushMatrix( )
elif (c == '\t'):
gl.glTranslatef( 4*width, 0, 0 )
elif (i >= 32):
gl.glBegin( gl.GL_QUADS )
gl.glTexCoord2f( (x )*dx, (y+1)*dy ), gl.glVertex( 0, -height )
gl.glTexCoord2f( (x )*dx, (y )*dy ), gl.glVertex( 0, 0 )
gl.glTexCoord2f( (x+1)*dx, (y )*dy ), gl.glVertex( width, 0 )
gl.glTexCoord2f( (x+1)*dx, (y+1)*dy ), gl.glVertex( width, -height )
gl.glEnd( )
gl.glTranslatef( width, 0, 0 )
gl.glEndList( )
if __name__ == '__main__':
import sys
glut.glutInit( sys.argv )
glut.glutInitDisplayMode( glut.GLUT_DOUBLE | glut.GLUT_RGB | glut.GLUT_DEPTH )
glut.glutCreateWindow( "Freetype OpenGL" )
glut.glutReshapeWindow( 600, 100 )
glut.glutDisplayFunc( on_display )
glut.glutReshapeFunc( on_reshape )
glut.glutKeyboardFunc( on_keyboard )
gl.glTexEnvf( gl.GL_TEXTURE_ENV, gl.GL_TEXTURE_ENV_MODE, gl.GL_MODULATE )
gl.glEnable( gl.GL_DEPTH_TEST )
gl.glEnable( gl.GL_BLEND )
gl.glEnable( gl.GL_COLOR_MATERIAL )
gl.glColorMaterial( gl.GL_FRONT_AND_BACK, gl.GL_AMBIENT_AND_DIFFUSE )
gl.glBlendFunc( gl.GL_SRC_ALPHA, gl.GL_ONE_MINUS_SRC_ALPHA )
gl.glEnable( gl.GL_TEXTURE_2D )
makefont( '/usr/share/fonts/truetype/ubuntu-font-family/UbuntuMono-B.ttf', 64 )
glut.glutMainLoop( )
这里一切正常,但是当我在这一行之后添加(其余的保持不变)时:
makefont( '/usr/share/fonts/truetype/ubuntu-font-family/UbuntuMono-B.ttf', 64 )
另一行:
makefont( '/usr/share/fonts/truetype/ubuntu-font-family/UbuntuMono-B.ttf', 32 )
它将呈现分辨率为32的字体,但大小为64,而(我认为)它应该只渲染64,因为我只在opengl显示列表的末尾添加了字符。顺便说一句,如果我切换那些makefont(),它将呈现分辨率为64的字体,但缩放到32的大小(看起来比32只更差)。我认为问题可能出在这一行:
gl.glTexImage2D( gl.GL_TEXTURE_2D, 0, gl.GL_ALPHA, Z.shape[1], Z.shape[0], 0,
gl.GL_ALPHA, gl.GL_UNSIGNED_BYTE, Z )
,但由于我对opengl和freetype很新,问题可能在其他地方。谢谢!