问题标签 [directwrite]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
direct3d - 从 DirectWrite 渲染到 Direct3D11 的最短路径?
自从我学习了 DirectX 7 以来,人发生了很大的变化。
在我看到的任何地方(除了Wikipedia),它都说我必须先从 DWrite 渲染到 D2D 或 GDI,然后才能做任何事情。
那个维基百科的文章错了吗?我不能渲染到 Direct3D 吗?
我想避免渲染到 D2D,因为显然,要让 D2D 写入 D3D,您还必须打开 D3D10.1 设备。
在 D3D11 中渲染文本真的需要这么多吗?
fonts - IE9 / Firefox 4+ (DirectWrite) 行高与旧 GDI 浏览器不一致
好的,这是一个很难解决的问题:
我有一个网站设计,它受到使用 DirectWrite 与 GDI 呈现字体的浏览器之间不同的行高的严重影响。这导致背景图像在 IE9 和 FF4+ 中未对齐(以及其他问题)。
这是一个简单的例子:
假设我们已经重置了 CSS。代码:
这以以下方式呈现:
如您所见,IE9(和 firefox 4+)中的文本比旧 GDI 浏览器短 1px。这会在我的网站的整个布局中引起重大问题,特别是在将背景图像(例如图标)放入内联元素时,如从我网站上完全相同的页面截取的两个屏幕截图所示(为了清晰起见,每 3px 添加行并加衬与第一行文本):
最终结果是图标在 IE9 中显示为 1px 和 2px。一种可能的解决方案是添加一个 2px 的 padding-top 来下推文本以与图标保持一致。除了 hacky 和一团糟(你能在 css 中挑出 firefox 4+ 吗?)所需的填充因元素而异(在我的情况下为 1-3px)并导致其自身的问题。
到底是怎么回事?我知道 DirectWrite 在某些情况下可以使字体更小,但是为什么浏览器制造商要改变以前的行高呢?当然,这会影响很多网站。
任何帮助将不胜感激。
干杯,狮子座
c++ - 透明 GDI+ DC 上的 DirectWrite 文本渲染
我有一个重要的预先存在的 GDI+ 代码主体,用本机 C++ 编写,其中包括在其上绘制文本和位图的透明层。这些层(使用具有自己的 GDI+ 图形的内存 DC 实现)随后在呈现到屏幕之前进行组合。
我对文本元素不太满意,因为 GDI+ 不允许单个文本运行具有多种画笔颜色,因此我必须将不同颜色绘制为单独运行的文本,彼此相邻。连接单独的文本运行很麻烦,因为相邻运行之间的字距调整等与不同颜色的连续单个运行不同。
切入正题,探索 DirectWrite 所提供的功能似乎是个好主意,因此我尝试复制 DirectWrite 中的一些现有功能。最具体地说,将文本呈现为透明位图。
这就是它变得困难的地方:我无法让 DirectWrite 文本在包含 alpha 的背景上呈现而不会出现抗锯齿问题(因为前景文本像素应该淡化为透明,而是淡化为黑色)。我的文字看起来像这篇文章中的示例。
MS 文档和这方面的示例有点薄,到目前为止,没有多少谷歌搜索/stackoverflow 搜索显示出任何重要的亮点。
我的代码包括以下 DirectWrite 内容:
看起来我需要回退到灰度抗锯齿,但我很挣扎。请有人:
- 解释灰度抗锯齿应该做什么,以及它是否适用于透明位图渲染目标;和
- 给我一些关于如何让灰度抗锯齿工作的建议?
c# - 如何使用 DWrite 测量文本范围?
如何使用 DirectWrite 获取文本范围?
例如,.Net 将其作为FormattedText 类的一部分提供。
gdi - 在 DirectWrite 中调整字母/字符间距
我正在使用 DirectWrite。如何调整整体字母间距?我想我想要GDI中的SetTextCharacterExtra等价物。
windows - 使用 DirectWrite、Windows API 或其他任何非 sprite 字体在 XNA 中呈现文本
我正在开发一个适用于任意屏幕分辨率(或窗口大小)的 XNA 游戏,虽然缩小和放大图形效果很好,但缩放 SpriteFonts 看起来很糟糕(更不用说 SpriteFont 本身看起来很糟糕,因为使用的压缩)。为每种尺寸制作一个 SpriteFont 是不可能的,因为尺寸可以是任何东西。
我听说 DirectWrite 甚至 Windows API 是在 XNA 中呈现实际矢量(TrueType 等)字体的一种方式,但找不到任何示例。
这在 XNA 中实现起来有多难?有什么我可以看的例子吗?还有其他选择吗?
显然,我不担心 Windows 以外的任何其他平台,因此任何仅 Windows 的代码都可以。
windows - 使用 DirectWrite 缩放文本
有谁知道如何使用 DirectWrite/Direct2D API 实现文本缩放?我需要平滑的高精度放大/缩小大量文本,但找不到任何演示/示例。
谢谢。
c++ - 字体轮廓 Beizier 样条曲线和 DirectWrite
我正在考虑可能将 DirectWrite 用于将在 DirectX 11 版本和 OpenGL 3.1+ 版本中出现的项目。
据了解,DirectWrite 使用位于 Direct3D 10.1 之上的 Direct2D(直到 DirectX 11.1 发布)。这意味着要在 Direct3D 11 中使用 DirectWrite,目前,我必须创建一个 Direct3D 10.1 设备和一个 Direct3D 11 设备,然后在这两个设备之间共享资源,这似乎带来了一些同步开销。另一个问题是我似乎无法通过这种设置将文本直接渲染到 d3d11 后备缓冲区,对吧...?
我也不知道是否有可能在任何实际意义上将 DirectWrite 与 OpenGL 结合起来..?我的猜测不是...
太好了......我也在考虑编写自己的字体渲染器,我希望能够根据它们的贝塞尔样条轮廓来渲染字体,以实现分辨率独立。我知道 GetGlyphOutline() 函数,但根据 MSDN 库,它似乎正在被弃用并且“......不应在新应用程序中使用”。查看 MSDN 上的 DirectWrites 参考页面,我看不到任何方法可以像使用 GetGlyphOutline() 那样在 Bezier 样条信息中获得相同的信息。您可以获得包含在 ID2D1SimplifiedGeometrySink 中的轮廓信息,但我看不到您如何从 ID2D1SimplifiedGeometrySink 中获得纯贝塞尔曲线、控制点、信息,您只能将其用于使用我的 D2D(D3D10.1)进行绘图在这一点上没有那么感兴趣。
有没有办法使用非弃用方法 DirectWrite 或其他方法来获取字体轮廓轮廓?
正如您可能知道的那样,我对 DirectWrite 和 Direct2D 都不太熟悉。我试图弄清楚该采取什么方向。是否值得走 DirectWrite/D2D 道路,或者制作我自己的字体渲染器,或者其他一些绝妙的想法 :)。有什么建议么?
PS我目前正在为Win7平台开发,发布后会迁移到Win8。
microsoft-metro - 如何将嵌入文件中的自定义字体加载到 Metro 应用程序中的 DirectWrite?
我一直在与从嵌入式文件加载字体以用于 DirectWrite 进行一场失败的战斗。我正在编写一个简单的益智游戏,它具有 C#/XAML 接口,但也使用 SurfaceImageSource 添加一些 DirectX 内容。
我编写了一个处理所有 DirectX 代码的 WinRT 组件,它工作得非常好。我的一些 DirectX 内容是使用 DirectWrite API 绘制的文本。只要我使用IDWriteFactory::GetSystemFontCollection()等从系统加载安装的字体,我就可以绘制我喜欢的所有文本。但是,我似乎找不到从嵌入文件加载自定义字体的方法。
据我所知,不允许 Metro 应用程序以与传统应用程序相同的方式从文件系统加载文件。所以,采用普通文件路径的IDWriteFactory::CreateFontFileReference()方法对我来说毫无价值,对吧?我需要从 ms-appx URL 加载我的文件。
因此,我在我的 WinRT 组件中编写了一个自定义字体加载器,它实现了IDWriteFontCollectionLoader接口(如果您之前从未做过,这将是一项繁重的工作),它使用新的StorageFile API从 ms-appx URL 加载字体。现在,我可以加载我的IDWriteFontFile并获得一个IDWriteFontFace,但是如果我尝试在字体上调用任何真正有用的方法,它会返回E_UNEXPECTED。我可以获得字形的数量和字形索引,但是如果我尝试调用GetGlyphRunOutline()或GetDesignGlyphMetrics()之类的东西,它会因E_UNEXPECTED而失败。使用相同的绘图代码生成只要我安装字体文件并通过以IDWriteFactory::GetSystemFontCollection()开头的一系列调用来获取IDWriteFontFace ,使用GetGlyphRunOutline()的ID2D1PathGeometry 就可以很好地工作。我正在使用普通的 true type 字体。
那么,如何将嵌入文件中的自定义字体加载到 Metro 应用程序的 DirectWrite 中?我可能只是遗漏了一些简单的东西,因为我确信其他人会希望能够以这种方式加载自定义字体。
我有一个示例项目(或者可以很容易地准备一个)给任何可以帮助我识别我的问题的人。
我已经并排加载了两个IDWriteFontFace对象,并试图找出有效的对象和损坏的对象之间的不同之处。为了找出它失败的原因,我需要看到的是隐藏在IDWriteFontFace界面中的不透明内容。请帮忙!
此处还发布了问题:使用 DirectX 论坛构建 Metro 风格游戏
c++ - 如何从 IDWriteFontFace 创建 IDWriteTextFormat
我正在创建 W8 C++/CX DirectX 应用程序,并且正在尝试使用来自应用程序自己的存储的自定义字体文件。我弄清楚如何使用IDWriteFactory::CreateFontFileReference从目录加载IDWriteFontFile,然后如何从中创建IDWriteFontFace。
我现在不知道的是如何使用IDWriteFontFace加载IDWriteTextFormat,如果可能的话。我应该这样做IDWriteFontCollection吗?
对不起,如果答案真的很愚蠢和微不足道,我对 DirectX 很陌生,并且在旅途中学习一切。