我的窗户是坐的,我需要在这里画文字。
我使用这个功能:
void displayText(std::string const& text, float x, float y)
{
int j = text.size();
glColor3f(1, 1, 1);
// std::cout << x << " " << y << std::endl;
// std::cout << (x / 900) * (2.0 - 1.0) <<" " <<(y / 900) * (2.0 - 1.0) << std::endl;
x = x / (float)900; //900 is my window size
y = y / (float)900;
x-=0.5f;
y-=0.5f;// std::cout << x << " "<<y << std::endl;
glRasterPos2f(x, y);
for(int i = 0; i < j; i++)
glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24, text[i]);
}
但它以错误的坐标绘制文字,颠倒,有什么想法吗?
答案 0 :(得分:2)
glRasterPos2f
将通过完整的转换管道,因此特别受以下因素影响:
这意味着您的问题标题具有误导性,因为这里的窗口空间和NDC坐标都不相关,而是对象空间坐标。
对于绘制基于位图的文本,最好在设置modelView时设置一些像素精确的正交矩阵(与视口大小相匹配)作为投影 认同:
glMatrixMode(GL_PROJECTION);
glOrtho(0, width, 0, height, -1, 1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glRasterPos2f(pixel_coords);
// draw bitmaps here
请注意,GL使用数学约定,因此原点将位于屏幕左下角的 bottom 处。你可以在正交矩阵中翻转它,但仍会绘制位图,以便它们的局部左下边缘将出现在光栅位置。
你应该知道所有这些东西 - 绘制位图,固定函数坐标转换,内置GL矩阵函数等等 - 完全弃用了近十年强>到现在。 OpenGL的现代核心配置文件不再支持,您将不得不使用基于纹理的方法进行字体渲染。使用带符号的距离字段是一个很好的选择,可以在屏幕上显示漂亮的字体。