3

我已经编写了这个函数来使用 python 和 python opengl 打印一些文本

def glut_print( x,  y,  font,  text, r,  g , b , a):

    blending = False 
    if glIsEnabled(GL_BLEND) :
        blending = True

    #glEnable(GL_BLEND)
    glColor3f(1,1,1)
    glRasterPos2f(x,y)
    for ch in text :
        glutBitmapCharacter( font , ctypes.c_int( ord(ch) ) )


    if not blending :
        glDisable(GL_BLEND) 

和渲染功能:

def Draw():
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT )

    glut_print( 10 , 10 , GLUT_BITMAP_9_BY_15 , "Hallo World" , 1.0 , 1.0 , 1.0 , 1.0 )
    # draw my scene ......
    glutSwapBuffers()

结果什么也没写,我正在查看我的几何和 3D 对象;但不是文字!问题出在哪里?

4

3 回答 3

3

很多 OpenGL 程序员都被这个抓住了(包括我自己)。

虽然 glRasterPos 看起来像使用像素坐标,但它们实际上在使用前由模型视图和投影矩阵转换。如果您尝试在 3D 空间中放置文本,这很有用,但当您需要某种叠加控制台或 HUD 时,它就没有那么有用了。

解决这个问题的旧方法是同时推送投影和模型视图矩阵,将两者设置为标识,绘制文本,同时弹出两者。

Mesa3D 的 Brian Paul 认为这很愚蠢,并添加了一个新的调用 glWindowPos,它获取窗口中的实际像素坐标。它在 OpenGL 1.4 左右成为标准。将您的 glRasterPos 替换为 glWindowPos 并查看是否可以解决问题。

于 2012-10-11T22:37:31.497 回答
0

我已经通过像这样切换投影解决了:

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

glut_print( 10 , 10 , GLUT_BITMAP_9_BY_15 , "Hallo World" , 1.0 , 1.0 , 1.0 , 1.0 )

打印后我回到常见的 3D 模型。

@Hug ...我也会尝试 glWindowPos

于 2012-10-12T06:24:46.013 回答
0

使用 gultStrokeCharacter 更好,角色可以旋转和缩放,因为它绘制线条来形成角色。

于 2019-11-04T14:02:23.730 回答