2016-04-03 92 views
1

我有我的窗口坐标,我需要在这里绘制文本。如何将窗口坐标转换为标准化的设备坐标?

我用这个函数:

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

什么是“错误坐标”?它与你期望的有什么不同? – Carcigenicate

+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使用数学惯例,因此原点将位于屏幕左下角的底部。 YOu可以在正交矩阵中翻转该位置,但Bitmaps仍将被绘制,以使其局部左下边缘出现在光栅位置。

你应该知道,所有的东西的 - 绘制位图,固定功能坐标变换,内建的GL矩阵功能等等 - 都完全因为近十年的现在过时了。现代的OpenGL核心配置文件不再支持,你将不得不使用基于纹理的方法进行字体渲染。使用带符号的距离字段是在屏幕上显示漂亮字体的不错选择。

相关问题