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

如何在openGL中扩展视口以保持打印文本的正确剪裁?,opengl,text,printing,glut,coordinate-systems,Opengl,Text,Printing,Glut,Coordinate Systems,我使用以下代码在openGL中使用GLUT绘制文本: 代码(初始部分),将我的原点(0,0)设置到左上角,并基于协调系统保持适当的屏幕分辨率: glViewport(0, 0, x, y); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0, x, y, 0, -1, 1); glMatrixMode(GL_MODELVIEW); 代码(打印部分): 直到从精确的X=>0坐标绘制文本,才会打

我使用以下代码在openGL中使用GLUT绘制文本:

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

    glViewport(0, 0, x, y);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, x, y, 0, -1, 1);
    glMatrixMode(GL_MODELVIEW);
代码(打印部分):

直到从精确的X=>0坐标绘制文本,才会打印文本。另外,当文本必须在右侧剪裁时,这个问题就不存在了——然后正确地打印出来——这就是我意识到它与文本的初始位置有关的地方

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

1) 在打印文本的过程中,保留从左上角(0,0)到右下角(高度、宽度)2)的屏幕坐标,并在内部扩展这些值,以便文本被剪裁而不是消失

虽然我做了研究,但有两天我还是找不到任何解决办法。我尝试使用glViewport和glOrtho,但我尝试的任何更改和方法(例如,将glViewport设置为-x,-y,x*2,y*2)都不会起作用-这些更改和方法总是会干扰我的屏幕协调系统,这对于保持基于窗口分辨率至关重要

PS:我做了进一步的研究,发现了这篇文章

10.070如何绘制初始glRasterPos()位于窗口左边缘或下边缘之外的glBitmap()或glDrawPixels()基本体?

当光栅位置设置在窗口外部时,它通常位于窗口外部 查看卷并随后标记为无效。渲染 glBitmap和glDrawPixels原语不会使用无效的 光栅位置。因为glBitmap/glDrawPixels生成向上和向下的像素 在光栅位置的右侧,似乎无法渲染 此类型的基本体由对象的左边缘和/或下边缘剪裁 窗户

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

这会告诉OpenGL渲染无操作位图,但移动当前 光栅位置依据(xMove,yMove)。你的申请将提供 (xMove,yMove)将光栅位置放置在视图外部的值 音量。使用glBitmap()或glDrawPixels()执行此调用 你想要的效果

可悲的是,我无法将这条建议付诸实践,一旦我使用了它,文本就完全丢失了

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

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

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

改用纹理映射字体或笔划字符。谷歌在这些网站上找到了数不清的信息

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

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

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


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

这些都是有效的观点——我已经意识到我可能需要在未来的项目中使用不同的打印功能——但就我现在的目的而言,这已经足够了,所以如果可以映射的话,我不会选择全新的绘图文本方法剪辑视图有点不同-这基本上是我的问题。另外-如这里所述:-在glut中绘制文本的问题是众所周知的-他们建议的解决方案之一是以不同的方式映射协调系统。可悲的是,我根本不了解他们的例子:(@seezelf:glRasterPos在剪辑卷外转换时,你无法绕过禁用的光栅操作。这是OpenGL的固有属性。如果你想坚持使用glutBitmapCharacter,那么最好的办法可能是将文本渲染为中间FBO,然后使用纹理将其绘制到场景中我在OpenGL.org上找到的解决方法怎么样?查找我的问题-我在其中添加了PS并进行了解释-基本上使用glBitmap(0,0,0,所需的X\u外部剪辑音量,所需的Y\u外部剪辑音量,NULL);它应该将rasterpos移动到所需位置,但无法使其工作。@seezelf:想法如下:使用glViewport设置的视口在窗口坐标中定义剪辑体积边界的范围。通过定义视口范围,可以将剪辑边界移动到窗口区域之外窗口。但是,必须通过调整投影来补充视口的扩展,以便再次匹配。如果投影是正交投影,将视口加倍,只需将视口范围传递到左、右、下、顶参数中。这些都是有效点-我已经实现了这一点我意识到我可能需要在未来的项目中使用不同的打印功能,但出于我的目的
void drawtext(GLfloat x, GLfloat y, const char* string )
{
    glRasterPos2f(x,y);
    while ( *string != '\0' )
         glutBitmapCharacter(p_glutfont,static_cast<int>(*string++));
}
         X axis      window
 axis Y  ----------------------------
        | y=40                       |
 x=-40__|_________                   |
    |Text to print|                  |
    |_____________|                  |
        |                            |
        |                            |
        |____________________________|
 glBitmap (0, 0, 0, 0, xMove, yMove, NULL);