1

我正在使用此代码在带有 GLUT 的 openGL 中绘制文本:

代码(初始化部分)将我的原点(0,0)设置为左上角并保持适当的基于屏幕分辨率的协调系统:

    glViewport(0, 0, x, y);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, x, y, 0, -1, 1);
    glMatrixMode(GL_MODELVIEW);

代码(印刷部分):

void drawtext(GLfloat x, GLfloat y, const char* string )
{
    glRasterPos2f(x,y);
    while ( *string != '\0' )
         glutBitmapCharacter(p_glutfont,static_cast<int>(*string++));
}

如果不仅当 X 和 Y 以负坐标开始时(由于带有作为标签打印的文本的对象部分在视图之外,那么整个文本都没有被绘制,那么一切都将是完美的。让我们想象一下我有一个上面带有文本标签的对象,它从左上角 x = -40, y = 40 进入视图:

         X axis      window
 axis Y  ----------------------------
        | y=40                       |
 x=-40__|_________                   |
    |Text to print|                  |
    |_____________|                  |
        |                            |
        |                            |
        |____________________________|

直到完全从 X => 0 坐标中绘制文本才被打印。此外,当必须在右侧剪切文本时,也不存在此问题 - 然后正确打印 - 这是我意识到它与文本的初始位置有关的地方。

我的问题是 - 我怎样才能正确地将我的视口/屏幕映射扩展到:

1) 保留从左上角 (0,0) 到右下角 (height,width) 的屏幕坐标 2) 在打印文本期间在内部扩展这些值 - 所以文本会被剪裁而不是消失?

虽然我做了我的研究,但我现在两天都无法找到任何解决方案。我尝试使用 glViewport 和 glOrtho,但我尝试过的任何更改和方法(例如将 glViewport 设置为 -x、-y、x*2、y*2)都无法解决问题 - 那些总是弄乱我的屏幕协调系统这对于保持基于窗口分辨率至关重要。

PS:我做了进一步的研究,发现了这篇文章http://www.opengl.org/archives/resources/faq/technical/clipping.htm

10.070 如何绘制在窗口左边缘或下边缘之外具有初始 glRasterPos() 的 glBitmap() 或 glDrawPixels() 图元?

当光栅位置设置在窗口之外时,它通常在视图体积之外,随后被标记为无效。渲染 glBitmap 和 glDrawPixels 基元不会出现无效的光栅位置。因为 glBitmap/glDrawPixels 会在光栅位置的上方和右侧产生像素,所以似乎无法渲染这种类型的被窗口左侧和/或底部边缘裁剪的图元。

但是,这里有一个常用的技巧:将光栅位置设置为视图体积内的有效值。然后进行以下调用:

 glBitmap (0, 0, 0, 0, xMove, yMove, NULL); 

这告诉 OpenGL 渲染一个无操作位图,但将当前光栅位置移动 (xMove,yMove)。您的应用程序将提供 (xMove,yMove) 值,将光栅位置置于视图体积之外。使用 glBitmap() 或 glDrawPixels() 执行此调用以进行所需的渲染。

可悲的是——我不能把这个建议付诸实践——一旦我使用它——文本就完全丢失了。

4

1 回答 1

1

这是我意识到它与文本的初始位置有关的地方。

几乎。glRasterPos 是一个光栅绘图操作命令,您放入其中的任何位置都会通过转换管道。如果该点位于裁剪体积之外(不是视口!),它将被丢弃,并且所有进一步的光栅绘制操作都将被禁用,直到指定了未裁剪的新 glRasterPos。

简单且推荐的解决方案是根本不使用光栅绘图操作,因为它们速度慢、支持差,并且已从后来的 OpenGL 中全部删除。glutBitmapCharacter 正在使用光栅绘图操作。

改用纹理映射字体或描边字符。谷歌发现了无数关于这些的信息。

于 2012-10-03T09:40:47.270 回答