Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 基本位图字体渲染_C#_C++_Algorithm_Graphics_Rendering - Fatal编程技术网

C# 基本位图字体渲染

C# 基本位图字体渲染,c#,c++,algorithm,graphics,rendering,C#,C++,Algorithm,Graphics,Rendering,虽然我以前也做过类似的主题,但这是从开始到结束位图字体渲染的最基本方法。我希望有人能看到我做错了什么 虽然这是一篇很长的文章,但如果Bug 1得到修复,它可以修复所有问题。这个问题涉及到C(1)和C++(Bugα2,Bugα3)。 对于位图字体渲染,我做了两件事 1) 创建大小为2056x2056(以C#为单位)的位图。我首先在512x512图像上绘制一个字符,然后将图像大小调整为128。我这样做的原因是为了以后可以在文本中添加影响。这也引入了Bug#1(见下文) 2) 为每个角色呈现一个单独的

虽然我以前也做过类似的主题,但这是从开始到结束位图字体渲染的最基本方法。我希望有人能看到我做错了什么

虽然这是一篇很长的文章,但如果Bug 1得到修复,它可以修复所有问题。这个问题涉及到C(1)和C++(Bugα2,Bugα3)。 对于位图字体渲染,我做了两件事

1) 创建大小为2056x2056(以C#为单位)的位图。我首先在512x512图像上绘制一个字符,然后将图像大小调整为128。我这样做的原因是为了以后可以在文本中添加影响。这也引入了Bug#1(见下文)

2) 为每个角色呈现一个单独的矩形(请参见错误2和错误3)

我遇到的问题是在序列中正确地呈现双字符。将出现UV的问题或字母间距问题。现在来看看虫子

错误1:字体大小 我呈现在512px图形上的字体是120。图形大小将调整为128,这是4倍小。在那里,我希望字体大小是30。保存位图后,我将在GIMP中查看它以进行调查。我要做的一件事是在位图中的一个角色上从GIMP绘制一个角色。这将给出有趣的结果,尽管我不确定这是否是错误的。从下图中可以看到,正确的绘制方法是让GIMP在“30px”处绘制角色,但是,如果我在“30px”处绘制角色,它会明显更小。之所以如此重要是因为以后在C++中,我会将映射模式设置为“SetMapMode(DC,MMXTY)”。尽管MSDN对此进行了详细说明,但MM_文本是“每个逻辑单元映射到一个设备像素”

事实证明,GIMP将“30pt”转换为“40px”。因此,对于我的C++代码,我将创建字体大小为“40”,因为我设置我的MaPoto到一个像素文本设置。这就是为什么首先修复bug是如此重要。如果这个bug得到修复,那么它就可以修复bug 1和bug 2

我向Bug#1提出的问题是,出了什么问题?我应该将贴图模式设置为其他模式吗?我将画一个512px的图形字符,然后调整图形大小。这是一个关键的步骤,所以我可以对角色的更大版本进行效果处理

错误2:紫外线 因为我每128像素存储一个字符,所以很容易获得每个字符的位图X/Y值。然而,我不确定UV的推进到什么程度才能正确绘制它们。我基本上尝试过做一些类似Promit posted for AngelCode位图字体渲染的事情,但是,因为我不确定它们是如何生成值的,所以我可能在这里错了。你可以在下面的两张图片中看到,我计算的紫外线是错误的

我对Bug#2的问题是,如何正确推进UV?查找位图X/Y的方式没有任何问题,只是如何移动它们以进行渲染

错误3:字母位置 我不知道如何正确移动我的角色,甚至不知道如何正确获得距离。目前我只做“A+B+C”。这张地图看起来是正确的,但是,如果你看下面的Arial图片,“j”在“n”和“f”之间看起来不合适。另外,Arial的“b”和“y”似乎也有问题,新罗马时代也有一些问题

我对Bug#3的问题是,如何正确提升我的角色

Arial渲染:

新罗马时报:

值得注意的是,我对使用任何外部库(如FreeType)或任何“黑客”来实现这一点不感兴趣。我希望看到使用windows api正确完成此操作。做这两件事中的任何一件都不是讨论的话题,如果我想用它们的话,我早就可以做了

由于板中的源标记已损坏,我将在粘贴箱中发布示例源

C#(位图绘制):
C++(字体渲染):

< P> 1点和像素是不同的单位。所以那里没有虫子。搜索“字体点像素”以获取解释


3-对于比例字体(如Arial),每个字符具有不同的宽度。在更高级的sceanrios中,字符组合的宽度可能与其各自宽度之和不同。你可以开始在MeasureString阅读(),阅读有关字体渲染的文章。

我一直在阅读这些信息,但是,像MeasureString在C是什么,不是C++,就像我说的,我需要它。另外,对单个字符使用MeasureString将为我提供相同的信息,如果我使用getcharabc,也有MeasureString的本地版本-。但是看看你的其他问题,你已经有了要阅读的信息。我再也帮不上忙了。。。