代码之家  ›  专栏  ›  技术社区  ›  Josh

如何计算OpenGL文本渲染的字符映射中的最佳字形边界

  •  -1
  • Josh  · 技术社区  · 10 年前

    为了使用OpenGL渲染文本,我采用了纹理四边形方法,为每个需要表示的角色绘制一个四边形。我将所有角色纹理信息存储在一个纹理中,并在纹理矩阵上使用glScalef和glTranslatef来选择纹理中的正确角色。起初,我只在用于创建纹理的图像中添加了几个字符,效果很好。

    从那时起,我需要渲染更多的字符,比如小写字母。我尝试添加更多的字符,但现在我的文本没有对齐并且变小了。

    有没有合适的方法来创建角色地图,或者我的方法都是错误的?

    注意:我使用的是单色字体,因此字体尺寸不应成为问题,但我也希望添加对具有非均匀大小字符的字体的支持。

    编辑:我使用的是顶点缓冲区,而不是即时模式。

    编辑2:包含角色贴图的纹理有9行,每行有11个字符。由于字符大小相同,我在纹理矩阵上使用glscalef,使其宽度为纹理的1/9,高度为1/11。VBO定义了四边形(0,0)、(1,0)、(0,1)和(1,1)以及tex坐标(0,0,(1,0,(0,1,(1,1))。这种不对齐似乎是由于我的变换没有完全适合每个字形。如何计算每个字形的最佳边界?

    1 回复  |  直到 10 年前
        1
  •  0
  •   Josh    10 年前

    希望这对其他人有用。最佳字形边界可以通过首先归一化每个字母的像素偏移量来计算,以便它们是0和1范围内的数字。宽度和高度也可以标准化,以确定正确的边界框。如果宽度和高度是统一的,如单字体,则可以使用静态宽度和高度值来计算字形边界。

    为每个字形保存一个像素位置值数组对于手动计算来说会很乏味,因此最好在字符映射的第一个像素处开始第一个字形,并且每个字母之间不留间隔。这将使使用for循环计算左下角的uv坐标变得容易

    void GetUVs(Vector2* us, Vector2* vs, float charWidth, float charHeight, int cols, int rows)
    {
        for (int x = 0; x < cols; x++)
        {
            for (int y = 0; y < rows; y++)
            {
                int index = x + cols * y;
                us[index].x = x * charWidth;
                vs[index].y = y * charHeight;
            }
        }
    }
    

    其余的边界可以通过分别加上宽度、高度以及宽度和高度来计算。