【问题标题】:Text not rendering with GLUT文本不使用 GLUT 呈现
【发布时间】:2014-12-30 22:17:40
【问题描述】:

我正在尝试将一个字符串渲染到屏幕上,但我无法让它工作

我使用freeglutvisual studio 2013。这是我的glutinit

glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH | GLUT_ALPHA); // Double buffering, RGB format
glutInitWindowSize(width, heigth);
glutInitWindowPosition(0, 0);
glutCreateWindow("Project Demeter");
glClearColor(1.0, 1.0, 1.0, 1.0);

glColor3f(1.0, 1.0, 1.0);

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0, width, heigth, 0.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

glEnable(GL_BLEND);
glEnable(GL_POINT_SMOOTH);
glHint(GL_POINT_SMOOTH_HINT, GL_NICEST);

还有我的文字图:

void text::draw()
{
    glColor3ub(_color[0], _color[1], _color[2]);
    glRasterPos2f(_x, _y);
    glDisable(GL_TEXTURE);
    glDisable(GL_TEXTURE_2D);
    for (char& c : _str)
    {
        glutBitmapCharacter(GLUT_BITMAP_HELVETICA_18, c);
    }
}

但是当我创建这样的文本时,屏幕上什么也没有:

float clr[3] = { 0, 0, 0 };
text* txt = new text(&DrawList, "test1234", clr, 600, 600);

有谁知道我做错了什么以及如何解决这个问题?

编辑:通过请求构造函数:

text::text(std::list<item*>* BaseList, const string str, const float color[3], int x, int y)
:item(BaseList)
{   
    if (str == "")
    {
        assert(0);
    }

    _str = str;

    _x = x;
    _y = y;

    if (!color) {      // When a null pointer is passed to this function
        _color[0] = 0;// black is used
        _color[1] = 0;
        _color[2] = 0;

    }
    else { //else copy it over
        copy_array(color, _color);
    }
}

EDIT2:所以我在 Windows 8 机器上对其进行了测试,它在那里工作?什么?我正常使用w7。这很奇怪。

【问题讨论】:

  • 发布您的文本 ctor 代码。
  • 在这里扮演明显的船长,但你在画框结束时打电话给glutSwapBuffers()吗?背景颜色出现了吗?
  • @RetoKoradi 是的,我使用它,但这里没有显示,是的,其他所有东西都显示出来了(线条和像素)
  • @Anonymous 我编辑了 OP 以包含它
  • 好的,让我们深入挖掘一下。为什么在浮动上使用 glColor3ub?这可能是次要的事情,因为你的颜色是黑色的。现在关于 w8/w7 的差异,听起来像是在某处使用了未初始化的变量。它们可以有不同的(随机值)。您是否逐步调试渲染,以便确保您的 text::draw 至少被执行?

标签: c++ opengl glut freeglut


【解决方案1】:

使用 c++ 字符串并遍历字符串来绘制每个字母。如果这没有帮助,那么在渲染文本之前尝试禁用混合或照明。在将文本放入“文本”类之前,您是否设法使用 glutBitmapCharacter() 函数显示文本?如果是这样,您可能对数据在文本类中的保存方式有疑问。同样,我建议在文本类中使用字符串对象(不是 char*),并使用 string::iterator 遍历字符串。


我现在不在我的电脑旁,但我稍后会发布一些代码,因为我正在处理一个类似的项目并启动并运行文本等。

我注意到您正在使用 glortho2d 并且您使用“raster2d”,但在绘制文本之前您没有禁用深度测试。我在 glortho 环境中使用“raster3f”,它允许对文本和对象等进行分层,并且无需禁用深度测试等。

此外,在您的文本构造函数中,您传递了一个指向“std::list*”的指针,但 STL 容器不是通过引用自动传递的吗?

稍后当我在电脑旁时,我会更有帮助

【讨论】:

  • 也许我应该指定这个,但我已经在做一个 c++ 字符串方法。 for 循环是一种 c++11 遍历 c++ 字符串的方法
猜你喜欢
  • 1970-01-01
  • 2015-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-27
  • 2021-04-23
  • 1970-01-01
相关资源
最近更新 更多