前言
在实时 3D 图形中保留尽可能高质量的文本具有挑战性。对象可以动态地改变它们的位置、旋转、比例和视角。所有这些都会对质量产生负面影响,因为文本通常只生成一次,而不是在每一帧中生成。根据字体引擎及其性能,为整个文本生成纹理需要很长时间。通常,这段时间足以影响性能。
本文档介绍了如何在对象为半动态时获得最佳文本质量的方法。半动态对象是既不经常(不是每帧)也不在动画时间内更改的对象。
此示例描述了如何计算字体大小,这应该使纹理像素与屏幕像素紧密匹配。
我们将使用作为 Android 一部分的字体引擎。字体引擎生成包含整个文本形状的 RGBA 图像。然后将图像上传到纹理中,然后将纹理映射到矩形上。矩形必须具有根据纹理大小定义的适当宽高比。
评估字体大小
要评估对象当前转换的字体大小,我们需要将矩形的四个角从 3D 世界空间转换为 2D 像素屏幕空间。以像素为单位表示角,我们可以计算两个左角之间的距离和两个右角之间的距离。然后根据这些距离计算平均值。平均值就是我们要查找的值,因为这是我们将用于生成图像的字体大小。
// 1. 使用当前矩阵计算屏幕坐标中的边界框
Vector4f cLT = new Vector4f(-0.5f,-0.5f, 0.0f, 1.0f);
Vector4f cLB = new Vector4f(-0.5f, 0.5f, 0.0f, 1.0f);
Vector4f cRT = new Vector4f( 0.5f,-0.5f, 0.0f, 1.0f);
Vector4f cRB = new Vector4f( 0.5f, 0.5f, 0.0f, 1.0f);
// 我们重用已经为渲染计算过的矩阵,而不是再次计算矩阵。update() 方法必须在 render() 方法之后调用
cLT.makePixelCoords(mMVPMatrix, theViewportWidth, theViewportHeight);
cLB.makePixelCoords(mMVPMatrix, theViewportWidth,</