Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用glRasterPos()在屏幕上按像素移动对象_C++_Opengl_Raster - Fatal编程技术网

C++ 使用glRasterPos()在屏幕上按像素移动对象

C++ 使用glRasterPos()在屏幕上按像素移动对象,c++,opengl,raster,C++,Opengl,Raster,我有以下代码在我的应用程序中呈现文本,首先我获得世界中的鼠标坐标,然后使用这些坐标将我的文本放置在世界中,因此它将跟随我的鼠标位置: 编辑:在代码示例中添加了buildfont()函数: GLvoid BuildFont(GLvoid) // Build Our Bitmap Font { HFONT font; // Windows Font I

我有以下代码在我的应用程序中呈现文本,首先我获得世界中的鼠标坐标,然后使用这些坐标将我的文本放置在世界中,因此它将跟随我的鼠标位置:

编辑:在代码示例中添加了buildfont()函数:

GLvoid BuildFont(GLvoid)                                // Build Our Bitmap Font
{
    HFONT   font;                                       // Windows Font ID
    HFONT   oldfont;                                    // Used For Good House Keeping

    base = glGenLists(96);                              // Storage For 96 Characters

    font = CreateFont(  -12,                            // Height Of Font
                        0,                              // Width Of Font
                        0,                              // Angle Of Escapement
                        0,                              // Orientation Angle
                        FW_NORMAL,                      // Font Weight
                        FALSE,                          // Italic
                        FALSE,                          // Underline
                        FALSE,                          // Strikeout
                        ANSI_CHARSET,                   // Character Set Identifier
                        OUT_TT_PRECIS,                  // Output Precision
                        CLIP_DEFAULT_PRECIS,            // Clipping Precision
                        ANTIALIASED_QUALITY,            // Output Quality
                        FF_DONTCARE|DEFAULT_PITCH,      // Family And Pitch
                        "Verdana");                     // Font Name (if not found, its using some other font)

    oldfont = (HFONT)SelectObject(hDC, font);           // Selects The Font We Want
    wglUseFontBitmaps(hDC, 32, 96, base);               // Builds 96 Characters Starting At Character 32
    SelectObject(hDC, oldfont);                         // Selects The Font We Want
    DeleteObject(font);                                 // Delete The Font
}

GLvoid glPrint(const char *fmt, ...){
    char text[256];
    va_list ap;
    if (fmt == NULL) return;
    va_start(ap, fmt);
        vsprintf(text, fmt, ap);
    va_end(ap);
    glPushAttrib(GL_LIST_BIT);  
    glListBase(base - 32);  
    glCallLists(strlen(text), GL_UNSIGNED_BYTE, text);
    glPopAttrib();
}

...

glPushMatrix();
    glColor4f(0,0,0,1);
    // X-1 wont work because these are the world coordinates:
    glRasterPos2d(MousePosX-1, MousePosY);
    glPrint("TEST");

    glColor4f(1,1,0,1);
    glRasterPos2d(MousePosX, MousePosY);
    glPrint("TEST");
glPopMatrix();
但是我想渲染多行文本,或者带有“边框”的文本(就像我在上面的代码中尝试的那样),或者带有背景的文本(这样我可以更好地将它们与背景区分开来) 那我怎么做呢

我只需要知道如何以像素为单位移动它,这样我就可以精确地修改屏幕上的位置,而无需在3d渲染投影上使用2d投影视图。。。我只是想让它尽可能简单


我试着在文本下面画一个四边形,但它当然不起作用,因为它仍然使用世界坐标。。。因此,当我旋转相机时,文本不会沿着文本的背景移动。。。恐怕唯一的解决方案是在3d投影上创建另一个投影…

下面是一段代码,我用它在一个小应用程序中呈现一些调试文本:

void
renderText(float x, float y, const char* text) {
    int viewport[4];
    glGetIntegerv(GL_VIEWPORT, viewport);
    glMatrixMode(GL_PROJECTION);
    glPushMatrix();
    glLoadIdentity();
    glOrtho(viewport[0], viewport[2], viewport[1], viewport[3], -1, 1);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glRasterPos2f(x, viewport[3] - y);
    const int length = (int)strlen(text);
    for (int i = 0; i < length; ++i) {
        glutBitmapCharacter(GLUT_BITMAP_9_BY_15, text[i]);
    }
    glMatrixMode( GL_PROJECTION );
    glPopMatrix();
    glMatrixMode( GL_MODELVIEW );   
    glPopMatrix();
}
void
renderText(浮点x、浮点y、常量字符*文本){
int视口[4];
glGetIntegerv(GL_视口,视口);
glMatrixMode(GL_投影);
glPushMatrix();
glLoadIdentity();
glOrtho(视口[0]、视口[2]、视口[1]、视口[3]、-1,1);
glMatrixMode(GLU模型视图);
glLoadIdentity();
glRasterPos2f(x,视口[3]-y);
常量int length=(int)strlen(text);
对于(int i=0;i

x
y
是字符串所需的窗口坐标<代码>glutBitmapCharacter(GLUT\u位图\u 9\u BY_15,…)
只是GLUT的一个实用函数,用于渲染一个9 x 15像素的大位图字符。

显示列表中有什么,我知道它是某种字形,但是列表是如何生成的?哦,等等,我现在编辑了我的第一篇文章。我不认为这有什么关系,因为我也想画四边形等等,而不仅仅是字体…这和我现在使用的基本相同:另一层“窗口”将2d投影模式置于3d渲染模式之上。@新手,您不想对文本进行单独投影有什么特别的原因吗?我想可能还有其他方法。。。没问题,我将在3d上使用2d投影:)