【问题标题】:OpenGL ES render bitmap glyph as texture positioning issuesOpenGL ES 将位图字形渲染为纹理定位问题
【发布时间】:2011-04-17 00:52:02
【问题描述】:

我只是在测试这些东西,所以我不需要替代方法(没有 GL 扩展)。只是希望有人看到我在使用 GLES 时的明显错误。

我想获取小于 32x32 的字形位图(宽度和高度不一定是 2 的幂)并将其放入纹理中,以便我可以渲染它。我首先创建了一个空的 32x32 纹理,然后将像素复制到更大的纹理中。

Gluint texture;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTextImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, 32, 32, 0,
              GL_ALPHA, GL_UNSIGNED_BYTE NULL);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, bitmap.width(), bitmap.height(),
                GL_ALPHA, GL_UNSIGNED_BYTE, bitmap.pixels());

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParamteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParamteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

然后我尝试使用纹理坐标仅绘制纹理的位图部分:

const GLfloat vertices[] = {
  x + bitmap.width(), y + bitmap.height(),
  x, y + bitmap.height(),
  x, y,
  x + bitmap.width(), y
};

const GLfloat texCoords[] = {
  0, bitmap.height() / 32,
  bitmap.width() / 32, bitmap.height() / 32,
  0, 0,
  bitmap.width() / 32, 0
};

const GLushort indices[] = { 0, 1, 2, 0, 2, 3 };

glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glVertexPointer(2, GL_FLOAT, 0, vertices);
glTexCoordPointer(2, GL_FLOAT, 0, texCoords);

glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, indices);

现在,如果一切顺利,由顶点创建的正方形的大小将与纹理的位图部分大小相同,它会准确地绘制我的位图。

假设我的字形是 16x16,那么它应该占据 32x32 纹理的左下象限。然后 texCoords 似乎与 (0, 0.5)、(0.5, 0.5)、(0, 0) 和 (0.5, 0) 是正确的。

但是我的 12x12 'T' 字形看起来像这样:

有人知道为什么吗?

顺便说一句。我首先为 2D 工作设置投影矩阵:

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0f, 480, 800, 0.0f, 0.0f, 1.0f);
glDisable(GL_DEPTH_TEST);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslate(0.375f, 0.375f, 0.0f); // for exact pixelization

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_ALPHA);
glEnable(GL_TEXTURE_2D);
glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);

【问题讨论】:

    标签: c++ opengl-es render-to-texture text-rendering


    【解决方案1】:

    顶点坐标和纹理坐标之间的映射似乎混淆了。尝试将您的顶点坐标更改为:

    const GLfloat vertices[] = {
      x, y + bitmap.height(),
      x + bitmap.width(), y + bitmap.height(),
      x, y,
      x + bitmap.width(), y
    };
    

    顺便说一句: 在您的情况下,我认为您不需要通过顶点索引走路线。更简单的是调用 glDrawArrays:

    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
    

    (因为您已经设置了 glVertexPointer 和 glTexCoordPointer)。

    【讨论】:

    • 你是我的英雄!不敢相信我错过了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多