- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试为从 ' '
到 '~'
的字符生成所有位图,并将它们添加到一个长纹理中。我打算将它们放置在固定宽度的纹理中,但现在我只想确保这个概念可行。
但是我遇到了问题。我没有得到预期的纹理,而是得到了下面的 16px 字体:
在我看来,好像我复制错了,但无论我做什么,我似乎总是得到相同的输出。
最后是代码:
字体.h
#ifndef _FONT_H_
#define _FONT_H_
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <GL/gl.h>
#include <ft2build.h>
#include FT_FREETYPE_H
#include "vector2.h"
#include "math_helper.h"
class Font {
public:
Font(const std::string font_path, int size);
~Font();
int get_texture() const { return texture_; }
private:
unsigned int width_, height_, texture_;
static FT_Library LIBRARY;
static const char START_CHAR = ' ';
static const char END_CHAR = '~';
static void initialize_library();
};
#endif
字体.cpp
#include "font.h"
FT_Library Font::LIBRARY = NULL;
Font::Font(const std::string font_path, int size)
: width_(64), height_(2), texture_(0) {
initialize_library();
FT_Face face = NULL;
int error = FT_New_Face(Font::LIBRARY, font_path.c_str(), 0, &face);
if(error == FT_Err_Unknown_File_Format) {
std::cout << "Error: Unknown file format for font \"" << font_path << "\"" << std::endl;
} else if(error) {
std::cout << "Error: Could not open font \"" << font_path << "\"" << std::endl;
}
error = FT_Set_Pixel_Sizes(face, 0, size);
if(error) {
std::cout << "Error: Could not set pixel size for font \"" << font_path << "\"" << std::endl;
}
int num_chars = (END_CHAR - START_CHAR);
width_ = to_nearest_pow2(num_chars * size);
height_ = to_nearest_pow2(size);
std::vector<unsigned char> buffer(width_ * height_, 0);
Vector2 pen;
for(char c = START_CHAR; c <= END_CHAR; ++c) {
error = FT_Load_Char(face, c, FT_LOAD_RENDER);
if(error) {
std::cout << "Error: Could not load char \"" << c << "\"" << std::endl;
continue;
}
FT_Bitmap bmp = face->glyph->bitmap;
int advance = (face->glyph->advance.x >> 6);
int bitmapWidth = bmp.width; //I have tried pitch, same problem
int bitmapHeight = bmp.rows;
for(int h = 0; h < bitmapHeight; ++h) {
for(int w = 0; w < bitmapWidth; ++w) {
int index = h * bitmapWidth + pen.x;
buffer[index + w] = bmp.buffer[w + bitmapWidth * h];
}
}
pen.x += advance;
}
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glGenTextures(1, &texture_);
glBindTexture(GL_TEXTURE_2D, texture_);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, width_, height_, 0, GL_ALPHA, GL_UNSIGNED_BYTE, &buffer[0]);
FT_Done_Face(face);
}
Font::~Font() {
if(texture_ != 0) {
glDeleteTextures(1, &texture_);
}
}
void Font::initialize_library() {
if(Font::LIBRARY == NULL) {
if(FT_Init_FreeType(&Font::LIBRARY) != 0) {
std::cout << "Error: Unable to initialize FreeType Library" << std::endl;
return;
}
}
}
Vector2 只是一个简单的结构,具有在构造时初始化为 0 的 x 和 y 字段。
to_nearest_pow2
定义为:
template<typename T>
T to_nearest_pow2(const T num) {
T nearest = 2;
while((nearest <<= 1) < num);
return nearest;
}
哦,这就是我将它绘制到屏幕上的方式(我使用的是正交投影)
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, test->get_texture());
glBegin(GL_QUADS);
glTexCoord2i(0, 0); glVertex2i(0, 0);
glTexCoord2i(1, 0); glVertex2i(400, 0);
glTexCoord2i(1, 1); glVertex2i(400, 400);
glTexCoord2i(0, 1); glVertex2i(0, 400);
glEnd();
编辑
我将 index
更改为@shouston 建议的内容,现在我得到了这个输出
最佳答案
将输出图像重新调整为 1000x60 之类的尺寸,您会大吃一惊。这是 paint.net 使用您附加的 PNG 制作的内容。
首先是显而易见的事情。字符基本上在那里,但出于某种原因,您只是将它们渲染得非常小(您传递的 size
值是多少?)
此外,您并没有尝试处理任何自由字体字符指标,因此不要指望它们都能很好地排列。然而……
关于c++ - 将 freetype 位图复制到 opengl 纹理时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15209494/
我有点困惑设置字符大小对象的字符宽度和高度字段(示例来自 FreeType tutorial 中所述) error = FT_Set_Char_Size( face, /*
我正在尝试使用 freetype 枚举字体文件中的字形(名称和 unicode)。 为了获取名称,我使用了 FT_Get_Glyph_Name。但是我怎样才能得到字形 unicode 值呢? 我是字形
它运行在 OS X 10.9 上。我使用 brew 和 FreeType v2.5.2 安装了 GraphicsMagick。但是当我在程序中使用 gm Convert 时,出现此错误: { [Err
项目设置: GameProject [此项目包含游戏代码] GameProject-Android GameProject-桌面 GameProject-robovm [这是一个无需使用任何自由字体即
尝试在 Ubuntu Linux 86-64 上编译 freetype 2.6.1 时,我在配置步骤收到以下消息: /usr/local/include/harfbuzz/hb-common.h:31
当字符串确实包含我使用的默认字体中不存在的字符时,如何告诉 freetype 使用后备字体? 我需要在我的应用程序中正确呈现非拉丁字形。 我必须自己管理回退吗? 如果是这样:如何检测给定字符串中是否缺
我已将“arial.ttf”文件(从我的/Windows/Fonts 文件夹中获取)加载到内存中,但是将其传递到 FT_New_Memory_Face 时会崩溃(在 FT_Open_Face 中的某处
我正在尝试使用 FreeType 为微 Controller 创建位图字体,但我对坐标表达方式的根本差异感到困惑。我的微 Controller 期望字形位图相对于左上角的原点有 X 和 Y 偏移,而
我正在编写一个 DirectX WindowsPhone 应用程序,我需要使用 FreeType。好吧,我已经下载了 FreeType 源代码并使用 CMake 为 WP ARM 生成 Visual
所以我尝试在我的图形引擎中使用带符号的距离字段实现字体渲染。 为此,我使用 FreeType 库生成所有字母的字形。具体来说,我正在尝试像这样加载单色位图: FT_Load_Char(face, c,
我目前正在尝试创建仅包含字形外部边界、内部没有任何填充的字形位图。为此使用 FreeType 库。这是我的代码,类似于 FreeType 引用中的示例 2 代码: Spans outlineSpans
我正在渲染文本,我需要字体的大写高度达到一定的像素数。例如,在下面的标志中,我需要让 SPEED 和 LIMIT 的高度相同,在本例中为 45 px,因此我将字体大小设置为45(我现在明白这不是一个好
我正在尝试使用 FreeType 2.4.11在我使用 openGL 渲染文本的项目中。 虽然我初始化了库,但只将 charmap 设置为 unicode 一次。在每次绘制的字符循环中使用 FT_Lo
我正在尝试创建单色字形图集,但遇到了问题。 Freetype 在字形的位图中呈现“废话”。我责怪 freetype,因为一些字形仍然正确呈现。 生成的纹理图集: 为什么会这样,我该如何解决? 但是我仍
我尝试在 OpenGL 和 FreeType2 中渲染文本,但我不知道如何在渲染字体时获取每行之间的空间(以像素为单位)。当我解析文本时,我希望能够做类似的事情 const char *text =
我正在尝试使用 AIDE 应用程序直接从我的手机使用 freetypefontgenerator。我已完成本文中显示的所有步骤:https://github.com/libgdx/libgdx/wik
这个问题与以下内容密切相关 Is there a way to programmatically determine if a font file has a specific Unicode Gly
我对 Mac OS X 环境比较陌生。 我试图安装 freetype 库以在 OpenGL 中显示文本,但我失败了。 我在一些论坛上读到 freetype 预装了 Mac OS X 山狮。 我只是想确
以前版本的 FreeType 有一个方法 setScale() 现在我可以使用以下方法更改比例: bitmapFont.getData().SetScale(); 但是我遇到了字母间距问题: /ima
使用 FreeType (2.10.1) 在我的游戏引擎中实现文本渲染,我遇到了奇怪的字形,包含重复四次的字母,在 x 轴上镜像并颠倒。 在所需的字母上方似乎有被解释为字形的相邻内存,它在每次运行时都
我是一名优秀的程序员,十分优秀!