-1

为了使用 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)。不对齐似乎是由于我的转换不完全适合每个字形。如何计算每个字形的最佳边界?

4

1 回答 1

0

希望这对其他人有用。最佳字形边界可以通过首先标准化每个字母的像素偏移量来计算,使它们是 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;
        }
    }
}

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

于 2014-08-14T21:06:48.670 回答