glutBitmapCharacter 文本位置错误

Posted

技术标签:

【中文标题】glutBitmapCharacter 文本位置错误【英文标题】:glutBitmapCharacter positions text wrong 【发布时间】:2012-02-24 12:33:35 【问题描述】:

我正在尝试在屏幕上绘制一个简单的字符串(覆盖)。

根据我在互联网上找到的信息,我是这样使用它的:

void write(string text, int x, int y)
    glRasterPos2i(x,y);

    for(int i = 0; i < text.length(); i++) 
        glutBitmapCharacter(GLUT_BITMAP_HELVETICA_12, text.data()[i]);
    

但是它根据世界坐标绘制字符串。比如说,如果 x 和 y 设置为 10,它们将在世界的 (10,10,0) 坐标处绘制。但我只是需要这个字符串在 2D 窗口的 (10,10) 坐标处。

这是一个小项目的一部分,绘制方法如下。我不想更改太多,因为它可能会破坏项目中的其他内容。

void disp()
 // set viewing translation and object rotations
 glMatrixMode( GL_MODELVIEW );
 glLoadIdentity ();
 glTranslatef( INIT_VIEW_X, INIT_VIEW_Y, INIT_VIEW_Z );
 glRotatef( xRot, 1.0, 0.0, 0.0 );
 glRotatef( zRot, 0.0, 0.0, 1.0 );
 glScalef( scaleFactor, scaleFactor, scaleFactor );
 glClear(GL_COLOR_BUFFER_BIT);
 draw();
 glFlush();

我也不完全知道他们做了什么,我认为将文本绘制到世界坐标与这段代码中的某些内容有关。我也试过Using GLUT bitmap fonts,但也没用。

我怎样才能简单地在屏幕上绘图。 OpenGL 过于复杂了。我试着简单地写到窗口,但它需要整个东西并转化为 3D 世界。我只是不想要这个。

【问题讨论】:

【参考方案1】:

从 twall,是的,您需要清除模型视图和投影矩阵

//TEXT
glMatrixMode( GL_PROJECTION ) ;
glPushMatrix() ; // save
glLoadIdentity();// and clear
glMatrixMode( GL_MODELVIEW ) ;
glPushMatrix() ;
glLoadIdentity() ;

glDisable( GL_DEPTH_TEST ) ; // also disable the depth test so renders on top

glRasterPos2f( 0,0 ) ; // center of screen. (-1,0) is center left.
glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
char buf[300];
sprintf( buf, "Oh hello" ) ;
const char * p = buf ;
do glutBitmapCharacter( GLUT_BITMAP_HELVETICA_18, *p ); while( *(++p) ) ;

glEnable( GL_DEPTH_TEST ) ; // Turn depth testing back on

glMatrixMode( GL_PROJECTION ) ;
glPopMatrix() ; // revert back to the matrix I had before.
glMatrixMode( GL_MODELVIEW ) ;
glPopMatrix() ;

【讨论】:

谢谢,这是我一直在寻找的,我还禁用了照明,因此它被渲染为所需的颜色。 glDisable(GL_LIGHTING);//Ignore lighting, its text【参考方案2】:

据我所知,您的目标似乎是orthographic projection.

我不确定 OpenGL 的具体情况(我习惯使用更高级别的图形库),但这里有几个链接可以作为起点:

Setting a orthographic projection matrix?

http://www.cprogramming.com/tutorial/opengl_projections.html

【讨论】:

【参考方案3】:

您可以像这样退回到“2D”坐标:

//save your current matrix on the stack, so you don't lose it
glPushMatrix();
//load identity matrix, so you don't have any 3d transformations
glLoadIdentity ();
//now you also can transform the text
//to the position just as you like
//glTransformf( ... )
//make sure the text is draw, even though it might be outside the viewing area
glDisable( GL_DEPTH_TEST )
drawMyFunkyText();
glEnable( GL_DEPTH_TEST )
//restore the matrix as it was before,
//so you can draw all your shapes as before
glPopMatrix();

【讨论】:

这只会重置当前处于活动状态的任何矩阵模式。如果 OP 使用透视投影,则光栅位置将出现在近剪裁平面之前。 感谢您的输入,我已将glDisable(GL_DEPTH_TEST) 添加到代码示例中,以确保文本仍能呈现 禁用深度测试无济于事,光栅位置将被近剪裁平面剪裁。对于位图(由 glutBitmapChar 使用),只有光栅位置的裁剪很重要。如果这一点被剪掉,它会影响整个事情。

以上是关于glutBitmapCharacter 文本位置错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 glutBitmapCharacter() 绘制文本关闭 opengl 程序

glutBitmapCharacter() 给出链接错误 c++

如何在 3D 对象(如球体)上绘制文本

使用 glutBitmapCharacter() 屏幕闪烁?

如何在 QOpenGLTexture 上渲染文本?

易语言文本随机插入文本