我目前正在尝试在OpenGL中将字符串输出到屏幕上,我的相关代码如下:
void drawBitmapText(char *string,float x,float y)
{
char *c;
glRasterPos2f(x, y);
for (c=string; *c != '\0'; c++)
{
glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_10, *c);
}
}
我的显示功能如下所示:
void display(void)
{
int speed=frame/20;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
frame++;
if((frame>=0) && (frame<1000)) // Scene 1.
{
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();
drawBitmapText("Hello World",200,200);
glutSwapBuffers();
}
}
我相信我已正确实施但显然没有。有任何想法吗?
答案 0 :(得分:1)
如果转换后传递给glRasterPos2f(x, y);
的xy位置位于视口之外,则将省略以下光栅绘制操作,直到指定了转换到视口内的新栅格位置。
如果您不知道“转型”和“视口”是什么意思,您应该对此进行自我教育。只有这么多:给glRasterPos
的坐标不是像素坐标。
答案 1 :(得分:0)
传递给glRasterPos2f()
的位置处理就像您传递给绘制调用的顶点一样。这意味着当前的变换(模型视图和投影)将应用于该位置。
如果您没有指定任何转换,则这两个转换的默认值都是标识转换。这意味着生成的坐标与输入坐标相同。
一旦应用了所有变换,OpenGL就会期望生成的坐标位于称为标准化设备坐标(NDC)的坐标系中。在该坐标系中,每个坐标方向的范围[-1.0,1.0]映射到窗口大小。这意味着如果不应用转换,则输入坐标应该已经在该范围内。
我能想到至少有3个选项可以帮助您:
指定范围[-1.0,1.0]中的坐标。例如:
glRasterPos2f(-1.0f, -1.0f);
会在左下角放置文字,然后:
glRasterPos2f(0.0f, 0.0f);
将它放在窗口的中心。
如果要以像素为单位指定位置,请设置相应的投影变换:
glMatrixMode(GL_PROJECTION);
glLoadIndentity();
glOrtho(0.0, width, 0.0, height, -1.0, 1.0);
glMatrixMode(GL_MODELVIEW);
使用glWindowPos2f()
代替glRasterPos2f()
。此功能还设置光栅位置,但在窗口坐标(以像素为单位)中输入,并且不应用当前变换。