【问题标题】:Unhandled exception on openGL text displayopenGL 文本显示上未处理的异常
【发布时间】:2013-10-18 12:18:16
【问题描述】:

我正在尝试使用 openGL 绘制文本,该文本将显示在 kinect 相机图像上的窗口中。该程序可以很好地绘制正方形和其他形状,但是当我调用该方法来绘制文本时,它会崩溃。它似乎在崩溃

glutStrokeCharacter(font, c);

其他一切正常,当我只注释掉这一行时,程序仍然运行良好。下面是我如何尝试绘制文本的代码 sn-p。

void Button::DrawSquare(bool selected)
{

    glEnable( GL_POINT_SMOOTH );
    glLineWidth(7);
    if (selected == true) glColor3f(0,1,0);
    else glColor3f((123.0/255.0f),(205/255.0f),(237.0/255.0f));
    glBegin(GL_LINE_LOOP);
        glVertex2f(X, Y);
        glVertex2f(X+length, Y);
        glVertex2f(X+length, Y+width);
        glVertex2f(X, Y+width);
    glEnd();
    glLineWidth(3);
    glColor3f(0,0,0);
    glBegin(GL_LINE_LOOP);
        glVertex2f(X, Y);
        glVertex2f(X+length, Y);
        glVertex2f(X+length, Y+width);
        glVertex2f(X, Y+width);
    glEnd();
    glLineWidth(4);


    //Start drawing text
    glMatrixMode(GL_PROJECTION);
    glPushMatrix();
    glMatrixMode(GL_MODELVIEW);
    glPushMatrix();
    if (selected == true) glColor3f(0,1,0);
    else glColor3f(1,1,0);
    void *font = GLUT_BITMAP_TIMES_ROMAN_10;
    glRasterPos2i(this->X+15,this->Y+35);
    string s(*this->trackname); 

    for (string::iterator i = s.begin(); i != s.end(); ++i)
    {
        char c = *i;
        glutStrokeCharacter(font, c);// <<-- Line that gives error
    }
    glMatrixMode(GL_MODELVIEW);
    glPopMatrix();
    glMatrixMode(GL_PROJECTION);
    glPopMatrix();
    glColor3f(255,255,255);
}

在文本之前绘制方块效果很好。

【问题讨论】:

  • 根据this GLUT_BITMAP_TIMES_ROMAN_10 是该功能不受支持的字体。尝试改用 GLUT_STROKE_ROMAN。
  • 我尝试使用指定的 GLUT_STROKE_MONO_ROMAN 和 GLUT_STROKE_ROMAN,但仍然收到相同的错误:(
  • 再想一想,您可能应该调用glutBitmapCharacter 而不是glutStrokeCharacter
  • 也试过了,也试过使用各种来源的代码,但我一直收到同样的错误!
  • 那么我没有想法,因为我从未使用过任何这些功能,也无法在您发布的代码中发现任何其他错误。

标签: c++ opengl


【解决方案1】:

这是一个如何使用 glutBitmapCharacter 呈现文本的最小工作示例:

static const std::string text_to_render = "testing 1 2 3 4";

void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glMatrixMode( GL_PROJECTION );
    glPushMatrix();
    glLoadIdentity();
    glMatrixMode( GL_MODELVIEW );
    glPushMatrix();
    glLoadIdentity();

    glDisable( GL_DEPTH_TEST );  // disable to render text in front of anything else

    glRasterPos2f(0, 0); // center of screen
    glColor4f(1.0f, 1.0f, 1.0f, 1.0f);

    GLvoid * font = GLUT_BITMAP_TIMES_ROMAN_10;
    glColor3f(1.0f, 0.0f, 0.0f);

    for(char chr : text_to_render)
    {
        glutBitmapCharacter(font, chr);
    }

    glEnable(GL_DEPTH_TEST); // re-enable depth test

    glMatrixMode(GL_MODELVIEW);
    glPopMatrix();
    glMatrixMode(GL_PROJECTION);
    glPopMatrix();

    glutSwapBuffers();
}

这里唯一的区别是我禁用了 OpenGL 的 GL_DEPTH_TEST,并且我在推送当前矩阵后加载了恒等矩阵。

如果有任何帮助,请告诉我。

【讨论】:

  • 不走运。仍然出现“glutBitmapCharacter(font, chr);”行的访问冲突错误和“glutSwapBuffers();”。我已经设置了断点并进行了调试,但是当我尝试进入 glutBitmapcharacter 方法时,它给出了错误?
  • 只是在黑暗中拍摄,但您确实在程序启动时调用了 glutInit(),对吧?另外,访问冲突指的是哪个内存位置?
  • 我在初始化屏幕时确实调用了它,使用this,但它仍然给我同样的错误 --> 在 KinectTest.exe 中 0x2af3617a 处未处理的异常:0xC0000005:访问冲突.
  • 非常感谢 Tom Knapen,这是因为我将 glutInit 放在了错误的位置,并使用了我上面提到的网站上的“丑陋黑客”。您在黑暗中的拍摄完全正确,已经这样做了几个小时,感谢您的帮助,现在松了一口气
猜你喜欢
  • 2015-02-28
  • 2021-06-21
  • 1970-01-01
  • 2021-10-22
  • 1970-01-01
  • 1970-01-01
  • 2023-01-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多