复制到 d3dtexture 的 FreeType2 字符显示为双字母

2023-12-26

我最近刚刚开始使用 FreeType 库,并开始尝试从缓冲区复制到 directx9 纹理。

然而,尽管我是从通过加载单个字符创建的缓冲区复制的,但目前还是出现了双字母:

[尝试复制字符“a”]

以下是我当前的代码:

void TexFont::freeTypeSave()
{
    static FT_Library  library;   /* handle to library     */
    static FT_Face     face;      /* handle to face object */

    if (FT_Init_FreeType(&library)) {
        NHelper::OutputDebugStringN("error");
    }

    if (FT_New_Face(library,TEXT("Fonts\\arial.ttf"),0,&face)) {
        NHelper::OutputDebugStringN("font load failed\n");
    }
    else {
        //NHelper::OutputDebugStringN("font faces: %d \n", face->num_faces);
    }

    static int error;
    static UINT width, height;
    static int mTtfSize = 64;
    static int mTtfResolution = 96;

    static IDirect3DTexture9* mTexture;
    static unsigned int mPixelBytes = 2;
    static unsigned int mDataSize = width * height * mPixelBytes;

    // size settings (convert font size to *64)
    FT_F26Dot6 ftSize = (FT_F26Dot6)(mTtfSize * (1 << 6));
    error=FT_Set_Char_Size(face, ftSize, 0, mTtfResolution, mTtfResolution);

    // load glyph + render
    error = FT_Load_Char( face, L'a', FT_LOAD_RENDER );
    if (error) 
        NHelper::OutputDebugStringN("could not load char");

    // start copy procedure
    width = face->glyph->bitmap.width;
    height = face->glyph->bitmap.rows;

    D3DXCreateTexture(
        g_engine->getDevice(),
        width, height,
        1, 0,
        D3DFMT_A8L8, D3DPOOL_MANAGED,
        &mTexture);

    D3DLOCKED_RECT lockedRect;
    mTexture->LockRect(0, &lockedRect,0, 0);   

    unsigned char* pSrcPixels = face->glyph->bitmap.buffer;
    unsigned char* pDestPixels = (unsigned char*)lockedRect.pBits;

    for(UINT i = 0; i < height; ++i)
    {
        //copy a row
        memcpy(pDestPixels, pSrcPixels, width * 2); //2 bytes per pixel (1byte alpha, 1byte greyscale)

        //advance row pointers
        pSrcPixels += face->glyph->bitmap.pitch;
        pDestPixels += lockedRect.Pitch;
    }
    NHelper::OutputDebugStringN("char width: %d, height: %d \n", width, height);

    mTexture->UnlockRect(0);

    D3DXSaveTextureToFileA("test.png",D3DXIFF_PNG, mTexture, 0);

    // release face
    FT_Done_Face(face);

    // library shutdown
    FT_Done_FreeType(library);
}

关于发生的事情以及我如何解决这个问题有什么想法吗?

注意:更改字体大小只会创建更大的图像。我仍然得到相同的结果。

- 更新 -

尝试了 Drop 的建议,我尝试改变我的memcpy(pDestPixels, pSrcPixels, width * 2);

to memcpy(pDestPixels, pSrcPixels, width * 1);它返回以下内容:

一个字形挤在图像的左侧,但图像保持相同的大小。 (字形仅占据图像空间的一半)


您将字符加载为

FT_Load_Char( face, L'a', FT_LOAD_RENDER );

这意味着that http://www.freetype.org/freetype2/docs/reference/ft2-base_interface.html#FT_LOAD_XXX

默认情况下,字形呈现在FT_RENDER_MODE_NORMAL mode

and

FT_RENDER_MODE_NORMAL http://www.freetype.org/freetype2/docs/reference/ft2-base_interface.html#FT_Render_Mode这是默认的渲染模式;它对应于 8 位抗锯齿位图。

但你复制为 16 位:

memcpy(pDestPixels, pSrcPixels, width * 2); //2 bytes per pixel (1byte alpha, 1byte greyscale)

您实际上不需要任何字符中的灰度组件来进行正确的渲染(您只需要知道是否必须向该像素应用颜色以及应用多少颜色)。因此,在加载时将所有角色设置为 8 位掩码。 然后在渲染之前转换为 32 位图像:将颜色应用到RGB组件并将掩码设置为A成分。我是在着色器中做的。

希望能帮助到你。快乐编码!

update 1

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

复制到 d3dtexture 的 FreeType2 字符显示为双字母 的相关文章

  • 使用 gcc 在 Linux 上运行线程构建块 (Intel TBB)

    我正在尝试为线程构建块构建一些测试 不幸的是 我无法配置 tbb 库 链接器找不到库 tbb 我尝试在 bin 目录中运行脚本 但这没有帮助 我什至尝试将库文件移动到 usr local lib 但这又失败了 任何的意见都将会有帮助 确定您
  • BASIC 中的 C 语言中的 PeekInt、PokeInt、Peek、Poke 等效项

    我想知道该命令的等效项是什么Peek and Poke 基本和其他变体 用 C 语言 类似PeekInt PokeInt 整数 涉及内存条的东西 我知道在 C 语言中有很多方法可以做到这一点 我正在尝试将基本程序移植到 C 语言 这只是使用
  • STL 迭代器:前缀增量更快? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中的预增量比后增量快 正确吗 如果是 为什么呢 https stackoverflow com questions 2020184 preincrement faster than postinc
  • 如何在 C++ 中标记字符串?

    Java有一个方便的分割方法 String str The quick brown fox String results str split 在 C 中是否有一种简单的方法可以做到这一点 The 增强分词器 http www boost o
  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • 访问外部窗口句柄

    我当前正在处理的程序有问题 这是由于 vista Windows 7 中增强的安全性引起的 特别是 UIPI 它阻止完整性级别较低的窗口与较高完整性级别的窗口 对话 就我而言 我想告诉具有高完整性级别的窗口进入我们的应用程序 它在 XP 或
  • 两个静态变量同名(两个不同的文件),并在任何其他文件中 extern 其中一个

    在一个文件中将变量声明为 static 并在另一个文件中进行 extern 声明 我认为这会在链接时出现错误 因为 extern 变量不会在任何对象中看到 因为在其他文件中声明的变量带有限定符 static 但不知何故 链接器 瑞萨 没有显
  • 如何定义一个可结构化绑定的对象的概念?

    我想定义一个concept可以检测类型是否T can be 结构化绑定 or not template
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • C 函数 time() 如何处理秒的小数部分?

    The time 函数将返回自 1970 年以来的秒数 我想知道它如何对返回的秒数进行舍入 例如 对于100 4s 它会返回100还是101 有明确的定义吗 ISO C标准没有说太多 它只说time 回报 该实现对当前日历时间的最佳近似 结
  • 编译时展开 for 循环内的模板参数?

    维基百科 here http en wikipedia org wiki Template metaprogramming Compile time code optimization 给出了 for 循环的编译时展开 我想知道我们是否可以
  • 有没有办法让 doxygen 自动处理未记录的 C 代码?

    通常它会忽略未记录的 C 文件 但我想测试 Callgraph 功能 例如 您知道在不更改 C 文件的情况下解决此问题的方法吗 设置变量EXTRACT ALL YES在你的 Doxyfile 中
  • C++ 继承的内存布局

    如果我有两个类 一个类继承另一个类 并且子类仅包含函数 那么这两个类的内存布局是否相同 e g class Base int a b c class Derived public Base only functions 我读过编译器无法对数
  • 对于某些 PDF 文件,LoadIFilter() 返回 -2147467259

    我正在尝试使用 Adob e IFilter 搜索 PDF 文件 我的代码是用 C 编写的 我使用 p invoke 来获取 IFilter 的实例 DllImport query dll SetLastError true CharSet
  • C++ 中的 include 和 using 命名空间

    用于使用cout 我需要指定两者 include
  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现
  • 指针和内存范围

    我已经用 C 语言编程有一段时间了 但对 C 语言还是很陌生 有时我对 C 处理内存的方式感到困惑 考虑以下有效的 C 代码片段 const char string void where is this pointer variable l
  • 使用 WGL 创建现代 OpenGL 上下文?

    我正在尝试使用 Windows 函数创建 OpenGL 上下文 现代版本 基本上代码就是 创建窗口类 注册班级 创建一个窗口 choose PIXELFORMATDESCRIPTOR并设置它 创建旧版 OpenGL 上下文 使上下文成为当前

随机推荐

  • Lua沙盒具有泄漏的特殊功能

    我正在尝试使用如何创建安全的 Lua 沙箱 https stackoverflow com questions 1224708 how can i create a secure lua sandbox构建我自己的泄漏沙箱 我正在尝试创建一
  • 使用 rpm 或 yum 删除多个软件包

    我被允许访问安装了 50 多个 php rpm 的服务器 我正在尝试将它们全部删除 基本上 我试图结合这两个命令 rpm qa grep php and rpm erase 我对管道和重定向有所了解 但我不知道如何将它们用于此目的 请帮忙
  • React Native Android 启动画面

    我正在尝试为 Android RN 应用程序构建启动屏幕 我已按照此处描述的步骤进行操作 https www bignerdranch com blog splash screens the right way https www bign
  • 将 BigQuery 嵌套字段内容展平为新列而不是行

    我有一些以下格式的 BigQuery 数据 thing name gameLost params key total games val str val 3 int val null key games won val str val 2
  • 检查 HTML5 表单有效性的方法?

    是否可以根据我为其设置的模式检查 html5 表单的输入元素是否有效 我知道伪类的东西 但我希望是这样的 document getElementById petitionName valid可以返回true or false 我真的希望我不
  • 为什么在 grails 3 中 stacktrace.log 没有用 logback 填充?

    当您创建新的 grails 应用程序时 默认的 logback groovy 文件 以及几乎每个 logback groovy 示例 甚至哈基先生的例子 http mrhaki blogspot com 2015 09 grails goo
  • 如何启用DDoS防护?

    DDoS 分布式拒绝服务攻击 通常会在服务器级别被阻止 对吧 有没有办法在 PHP 级别上阻止它 或者至少减少它 如果不是 阻止 DDoS 攻击最快 最常见的方法是什么 DDOS 是一系列攻击 可淹没数据中心的关键系统 包括 托管中心与互联
  • 使用 javascript Office api 以编程方式打开 Excel 文档

    如何使用 javascript office api 以编程方式打开文档 有没有办法使用 javascript office api 插入文档或访问文档 xml 像这样的东西 Excel run function ctx var appli
  • 为什么 Statsmodels OLS 不支持读取包含多个单词的列?

    我一直在尝试使用 Seaborn 的 lmplot 和 Statsmodels ols 函数来绘制简单的线性回归图及其相关的 p 值 r 平方等 我注意到 当我指定要用于 lmplot 的列时 我可以指定一个列 即使它有多个单词 impor
  • 对此文件的更改未保存到 google chrome 版本 30.0.1599.101 m 中的文件系统错误

    在 google chrome 版本 30 0 1599 101 m 中 我无法保存更改后的 js 文件 保存 js 文件时 我收到黄色三角形符号 并显示 对此文件的更改未保存到文件系统 消息 我知道这曾经在旧版本中起作用 我使用的是 wi
  • 百里香+春日转换

    这是我的数据模型 我想使用这里的日期 我在我的 html 中这样做 table tbody tr tr td user td td date td tr tr tbody table 但它带来了 table table
  • 如何更改默认的 git 提交消息

    我在prepare commit msg 文件中添加了对提交消息的一些更改 然后执行此命令 git config global commit template git hooks prepare commit msg 之后 当我执行 git
  • Node.js 缓存代理服务器

    我正在尝试使用node js 创建一个http 缓存代理服务器 我可以在其中转发到任何网页并将它们缓存在我的本地磁盘上 以下是我的第一次尝试代码 var http require http url require url sys requi
  • Galaxy Tab 在设备上调试?

    有人对 Galaxy Tab 进行过设备调试吗 我有一个普通的 Galaxy Tab 虽然 Eclpise 会让我在设备上 运行 我的应用程序 但如果我在 eclpise 中单击 调试 它不会执行任何操作 也不会尝试连接到调试器 Ideas
  • 使用 istio 作为外部 TLS 服务的反向代理

    Istio 允许您在 a 中路由 http 请求VirtualService到外部主机提供ServiceEntry存在 例如 apiVersion networking istio io v1alpha3 kind ServiceEntry
  • 未找到名称为“${body}= 创建词典”的关键字

    settings Library RequestsLibrary Library Collections Library OperatingSystem Library SeleniumLibrary Variables username
  • python numpy 成对编辑距离

    所以 我有一个 numpy 字符串数组 我想使用此函数计算每对元素之间的成对编辑距离 scipy spatial distance pdist 来自http docs scipy org doc scipy 0 13 0 reference
  • 如何将应用程序命令绑定到视图模型(WPF)?

    我已经阅读了 Josh Smith 的有关使用 RelayCommand 绑定命令以查看模型的文章 但是 我需要将 ApplicationCommands Save 绑定到视图模型 以便当用户单击保存菜单项时它会在窗口中处理 这怎么可能 我
  • 了解 iOS 应用程序中使用的 MVC 模式

    我读过Apple的MVCarticle https developer apple com library ios documentation Cocoa Conceptual CocoaFundamentals CocoaDesignPa
  • 复制到 d3dtexture 的 FreeType2 字符显示为双字母

    我最近刚刚开始使用 FreeType 库 并开始尝试从缓冲区复制到 directx9 纹理 然而 尽管我是从通过加载单个字符创建的缓冲区复制的 但目前还是出现了双字母 尝试复制字符 a 以下是我当前的代码 void TexFont free