【发布时间】:2014-06-19 08:05:50
【问题描述】:
我正在尝试实现字体渲染,但在字形指标方面遇到了一些问题。 这是我获取指标的代码:
Glyph gl;
gl.width = face->glyph->metrics.width / 64;
gl.height = face->glyph->metrics.height / 64;
gl.character = i;
gl.advance = face->glyph->metrics.horiAdvance / 64;
gl.bearingX = face->glyph->metrics.horiBearingX / 64;
gl.bearingY = face->glyph->metrics.horiBearingY / 64;
gl.textureX = this->_textureWidth;
gl.advance 的值太小了。这是它的图片:
如果我将face->glyph->metrics.horiAdvance 除以 40,它看起来像这样:
文本现在可读,但前进和 X、Y 轴承仍然不正确。它应该是这样的:
这是我绘制字形的代码:
float aspect = this->_graphics->getMetrics().x / this->_graphics->getMetrics().y;
float offset = 0;
for(unsigned char c : str){
Glyph g = this->_fonts[fontID]->getGlyph(c);
vec2 pos = (position.getRelative() + vec2(offset, 0) + (vec2(g.bearingX, -g.bearingY) / SCALING) * scale - vec2(1, 1))
* vec2(1, -1);
glyphShader->setUniform("position", pos);
glyphShader->setUniform("scale", (vec2(g.width, g.height * aspect) / SCALING) * scale);
glyphShader->setUniform("glyphSize", vec2(g.width, g.height));
glyphShader->setUniform("textureMetrics", this->_fonts[fontID]->getTextureMetrics());
glyphShader->setUniform("textureOffset", vec2(g.textureX, 0));
glyphShader->setUniform("image", 0);
glyphShader->setUniform("color", color);
this->_graphics->getMeshByID(guiInstance->_quadID)->drawMesh();
offset += (g.advance / SCALING) * scale;
}
我正在对position 进行一些转换,以将原点移动到左上角并翻转 X 轴上的坐标系。然后我将每个像素值除以一个常数因子,以使字体在每个分辨率上都具有相同的大小。字形的比例是正确的,但不是对齐。
这是我的顶点着色器:
#version 400
layout(location=0) in vec4 vertPosition;
layout(location=1) in vec2 vertUV;
uniform vec2 position;
uniform vec2 scale;
uniform vec2 glyphSize;
uniform vec2 textureMetrics;
uniform vec2 textureOffset;
out vec2 fragUV;
void main(void){
gl_Position = vertPosition *
vec4(scale, 1, 1) +
vec4(position, 0, 0);
fragUV = vec2(vertUV.x * (glyphSize.x / textureMetrics.x) + (textureOffset.x / textureMetrics.x),
-vertUV.y * (glyphSize.y / textureMetrics.y));
}
为什么字符错位?
【问题讨论】:
-
您绝对不想除以 40,这甚至不是 2 的幂。 FreeType 中的坐标是定点的; 26.6 在这种情况下。整数除以 64 与向右移动 6 几乎相同 - 你会丢失任何坐标的小数部分。我不确定在这个例子中是否会有任何小数坐标,但是如果它们存在,除以 64.0f 而不是 64 应该保留它们。
-
谢谢,但这并不能解决问题。
-
另外,由于您没有在视口的所有坐标范围为 [-1,1] 的坐标范围内转换这些顶点,您是否正在补偿这一事实?如果您计算的偏移量应该是像素坐标(窗口空间),那么事情会变得很奇怪。我想这就是
SCALING和scale的用途,但您还没有展示它们是如何计算的。
标签: c++ opengl text fonts freetype