如何在openGL中扩展我的视口以保持打印文本正确剪裁?

时间:2012-10-03 09:34:01

标签: opengl text printing glut coordinate-systems

我正在使用此代码在带有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 =&gt;中抽出文本才开始打印。 0协调。当文本必须在右侧剪切时 - 这个问题不存在 - 然后它被正确打印 - 这是我意识到它与文本的初始位置有关。

我的问题是 - 如何将我的视口/屏幕映射正确地扩展到:

1)保持从左上角(0,0)到右下角(高度,宽度)2的屏幕协调,在打印文本时内部扩展这些值 - 这样文本就会被剪裁而不是消失?

虽然我做了我的研究,但我现在不能在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()来执行此调用   你想要的渲染。

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

1 个答案:

答案 0 :(得分:1)

  

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

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

简单和推荐的解决方案是根本不使用光栅绘制操作,因为它们很慢,支持很差并且已经从以后的OpenGL中删除了。 glutBitmapCharacter正在使用光栅绘制操作。

使用纹理映射字体或描边字符。 Google发现了大量关于这些信息的信息。