问题标签 [direct2d]
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.
c++ - Windows 编程:ID2D1Bitmap 接口 - 获取位图数据
我一直在编写自己的函数库来访问一些新的 Direct2D Windows 库。特别是,我一直在研究 ID2D1Bitmap 接口。我想编写一个函数来返回指向位图数据开头的指针(用于编辑特定像素,或自定义编码或我将来可能希望的任何其他内容)。不幸的是......前面的问题......
我似乎找不到从 ID2D1Bitmap 接口访问原始像素数据的方法。
有谁知道如何访问它?我的一位朋友建议将位图绘制到表面并从那里提取位图数据。我不知道这是否可行。它肯定看起来效率低下,我不知道要使用哪种表面。
任何帮助表示赞赏。(尤其是 c++,但我认为代码在语言之间不会有太大差异)
(我知道我可以直接从文件中读取数据,但我使用的是 WIC 解码器,这意味着它可以是任意数量的无法辨认的格式)
c# - 为什么 Direct2D 和 DirectWrite 不使用传统的 COM 对象?
我正在使用 C# 中的一个小 2D 游戏引擎,并决定使用 Direct2D 和 DirectWrite 进行渲染。我知道有 Windows API 代码包和 SlimDX,但我真的很想深入研究并从头开始编写接口。我正在尝试不使用托管 C++,但 Direct2D 和 DirectWrite 似乎不使用传统的 COM 对象。它们定义了派生自 的接口IUnknown
,但似乎无法从 C# 与 COM 互操作实际使用它们。中有 IID d2d1.h
,但没有 CLSID。
当然,我对 COM 互操作真的很陌生,所以也许我只是遗漏了一些东西。有人可以阐明这种情况吗?
windows - GDI 中的每像素每组件 Alpha 混合
我有一个带有 R、G、B 颜色通道的 24 位位图和一个带有 R、G、B alpha 通道的 24 位位图。我想将第一个位图与 GDI 中的 HDC 或 Direct2D 中的 RenderTarget 分别与 alpha 通道进行 alpha 混合。例如,假设对于一个像素,位图颜色为 (192, 192, 192),HDC 颜色为 (0, 255, 255),alpha 通道为 (30, 40, 50)。最终的 HDC 颜色应该是 (22, 245, 242)。我知道我可以先将 HDC BitBlt 到内存 HDC,然后通过手动计算每个像素的颜色进行 alpha 混合,最后将 BitBlt 返回。我只是想避免额外的 blitting 并让 API 完成它们的工作(更快,因为它们在内核空间中)。
我想到的第一个想法是将源位图拆分为 3 个仅红色、仅绿色和仅蓝色的 8 位位图,进行正常的 Alpha 混合,然后将 3 个输出位图合成到 HDC 中。但我找不到在 Windows 中本地进行拆分和组合的方法(Direct2D 层有帮助吗?)。此外,拆分和合成可能需要许多额外的复制。性能开销会太高。
或者也许在 3 遍中进行 alpha 混合。每次通过对一个通道应用混合,同时保持其他 2 个不变。
感谢您的任何评论。
编辑:我发现了这个问题,答案应该很好地参考了这个问题。但是,除了 AC_SRC_OVER 之外,不支持其他混合操作。为什么微软不改进他们的 API?
c++ - 使用 Direct2D 无法解析的外部符号
我正在尝试从此处下载并构建“WIC Image Viewer usign Direct2D” ,但是当我构建我的解决方案时,我遇到了 56 个错误,如下所示:
- 错误 1 错误 LNK2019:未解析的外部符号 __imp__CoUninitialize@0 在函数 _wWinMain@16 WICViewerD2D.obj 中引用
- 错误 2 错误 LNK2019:未解析的外部符号 __imp__DispatchMessageW@4 在函数 _wWinMain@16 WICViewerD2D.obj 中引用
- 错误 3 错误 LNK2019:未解析的外部符号 __imp__TranslateMessage@4 在函数 _wWinMain@16 WICViewerD2D.obj 中引用
等等。这肯定是我的 Visual Studio 设置中的内容,因为这段代码不应该开箱即用吗?我安装了 Windows SDK v7.0。
msdn - 如何在简单的 Direct2D 应用程序中计算 fps?
嘿伙计们,感谢您的关注。我从 MSDN 构建了简单的 D2D 应用程序,可在此处获得。现在,我想绘制一些图元并添加一个 fps 计数器。
我有一个 OnRender() 事件,我在其中绘制矩形等。我还调用了 RenderTextInfo(),我调用了 RenderTarget->DrawText。我在哪里添加计算每秒帧数的逻辑?
非常感谢。
c# - Direct2D / GDI+ 和缓慢的 Windows 窗体绘图 - 可以做什么?
我经常使用 Visual Studio 2008、.NET C# 2.0-3.5 和 Windows 窗体,我注意到,像我之前的许多人一样,GDI+ 在绘制控件方面非常慢。请注意,我不太会处理图像(JPG、GIF 等)。图像仅在某些地方作为图标。这实际上是绘制缓慢的控件/表单/等。
问题是您可以看到正在绘制的控件,并且可能需要几秒钟才能绘制一组看似简单的控件。即,它的滞后和可怕。
我已经进行了测试,我只是在表单上放置了一些标签(40-50),按 F5 运行并且必须等待它们被绘制。再次,滞后,不是一个很好的体验。
所以,有 WPF 可以解决这个问题,但我/我们还没有准备好迁移到 WPF。所以我四处寻找解决方法或修复程序,我偶然发现了 Direct2D,并且在阅读其他一些库时。
让我有点困惑,因此有这些问题:
1) 首先,我想要的是一种相当简洁的方法,只需用更快和硬件加速的方法替换GDI+。是否可以在不使用 WPF 且无需重写所有 Windows 窗体代码的情况下做到这一点?
每当我在 Direct2D 上阅读任何内容时,我都会看到一长串通常很糟糕的 C++ 代码,告诉我如何手动编写代码以进行绘图。我不要那个。
2) 在网上阅读时,我偶然发现了 SlimDX,但我不知道如何使用它(我承认,我在写作时没有尝试过很多)。假设我已经有一个 GUI 应用程序(Windows 窗体,标准 C# 代码)——我可以以某种方式使用 SlimDX(或类似的东西)来“替换”GDI+ 而无需过多重写吗?
我的问题是我找不到任何示例或类似的东西来告诉我是否可以在我已经创建的 Windows 窗体软件中使用 SlimDX、Direct2D 或其他类似的东西,如果可以的话 - 怎么做。
希望我不要太模糊=)
==编辑== 2010-09-22
我已经在我的真实应用程序中进行了一些测试,并将其中一件缓慢的事情隔离出来:
当我将文本添加到用户控件中的某些标签时,控件会自行调整大小以适应文本。例如,包含 GroupControl 会稍微适应刚刚添加到 Labels 的 .Text-property 的文本的大小。
大约有 10 个标签控件。第一次更新标签并因此更改大小时,整个过程大约需要 500 毫秒。第二次更新标签,大小没有变化,大约需要0毫秒。
==编辑 2== 2010-09-22
发现其中一个减速。然后将字符串添加到 Text-property 如果正在添加的文本的字符串长度与更新前的文本不同,则会很慢。
我正在使用 DevExpress 库,并且可以将 LabelControls 设置为 AutoSizeMode。如果我将其设置为“无”,那么当添加长度与前一个文本不同的文本时,延迟就会消失。我猜这个问题对于普通的标签控件来说是一样的,因为它也有一个 AutoSize = true/false 设置。
然而,它是一种“解决方法”,但仍然证明了我的观点——调整大小时它真的很慢,这很蹩脚。
delphi - TDirect2DCanvas 是慢还是我做错了什么?
在寻找替代 GDI 的替代品时,我试图在 Windows 7中测试 Delphi 的 2010 TDirect2DCanvas性能。
我通过使用 Direct2D 绘制一条巨大的折线对其进行了测试,结果速度非常慢,即使数据量比我使用 GDI 运行相同测试的数据量少 500 倍(我什至没有使用位图作为 GDI 中的后缓冲,我只是直接画到表单画布上)。
所以我猜要么:
a) Direct2D比GDI慢;
b) TDirect2DCanvas 很慢;
c)我做错了什么
,希望是 c)。
我写的测试代码是:
此外,我真的很愿意在实际代码中绘制长折线,因为我正在开发的系统需要绘制大量约 2500 点的折线(至少 10K 条)。
更新 (2010-11-06)
我之前发现 Direct2D 似乎不喜欢折线,如果您使用大量单线(2 点折线),它会绘制得更快。
多亏了Chris Bensen,我发现在使用 anti-aliasing 时,大型折线的速度很慢。所以我按照 Chris 的建议禁用了抗锯齿,绘制 50k 线的性能从 ~6000ms 到 ~3500ms。
事情仍然可以改进,因为 Direct2D在使用 anti-aliasing 时不能很好地处理折线。禁用抗锯齿功能则相反。
现在用 Direct2D 绘制 50k 线的时间,如果我在没有抗锯齿的情况下绘制大折线,大约是 50 毫秒。不错,嗯!
问题是,如果我绘制位图, GDI 仍然比 Direct2D 快,并且在完成后我 BitBlt 将结果返回到表单,它以 ~35ms的速度绘制,并且具有相同的图形质量。而且,Direct2D 似乎也已经在使用后备缓冲区(它只是在EndDraw()
被调用时绘制)。
那么,这是否可以通过某种方式改进以使使用 Direct2D 在速度方面值得?
这是更新的代码:
顺便说一句,即使我使用Chris预先创建几何图形的建议,速度也与 GDI 的速度大致相同,但仍然没有更快。
我的电脑正常运行 Direct3D 和 OpenGL 应用程序,这里是 dxDiag 输出:http ://mydxdiag.pastebin.com/mfagLWnZ
如果有人能解释我为什么会这么慢,我会很高兴。示例代码非常感谢。
list - 如何创建随机数量的 D2D 形状(矩形和椭圆)并在绘图时将它们称为数组?
让我详细说明。我像这样定义一个 D2D 矩形:
和一个椭圆:
为了绘制这些形状,我首先转换它们并将它们传递给渲染目标:
我想要一种方法来创建随机数量的矩形和椭圆,并将它们存储在一个数组中,然后也可以绘制它们。我有一个函数可以返回一个从零到五的随机数。我希望能够使用该数字创建一个指向这些形状的数组,并遍历它们以将它们绘制到屏幕上。关于如何解决这个问题的任何想法?
c++11 - 无法创建 Direct2D DXGI Surface
我正在调用这个方法:
http://msdn.microsoft.com/en-us/library/dd371264(VS.85).aspx
调用失败并显示E_NOINTERFACE
。该文档对于为什么会发生这种情况尤其没有帮助。我已经启用了所有 DirectX 11 调试功能,这是我得到的最好的。我知道我有一个有效的IDXGISurface1*
(也试过IDXGISurface
)并且其他参数设置正确。关于为什么这个电话可能会失败的任何想法?
编辑:
我在创建 D3D11 设备时也遇到了问题。如果我在 D3D11CreateDeviceAndSwapChain 中将 nullptr 作为 IDXGIAdapter* 参数传递,它工作正常,但如果我自己枚举适配器并传入一个指针(唯一返回的),它会因参数无效而失败。MSDN 文档明确指出,如果传递了 nullptr,则系统使用 EnumAdapters1 的第一个返回值。我正在运行 DX11 系统。