问题标签 [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.

0 投票
2 回答
3071 浏览

transparency - GDI 渲染到 direct2D ID2D1BitmapRenderTarget 始终是透明的

我想将我的电影渲染软件从 DirectDraw 移植到 Direct2D。由于兼容性问题,需要在图像之上进行 GDI 渲染。为了优化性能,我想实现某种后缓冲机制,但是 alpha 通道信息似乎有问题,所有 GDI 绘图都显得有些透明

我为我的窗口句柄创建了一个ID2D1HwndRenderTarget和一个用于将图像复制到的ID2D1Bitmap。位图的像素格式为DXGI_FORMAT_B8G8R8A8_UNORM,alpha 模式为D2D1_ALPHA_MODE_IGNORE。HwdRenderTarget 与 GDI 兼容,所以我的渲染函数看起来像这样:

这个版本工作得很好:GDI 对象用纯色绘制,DrawTextEx-Text 有透明背景。

为了优化性能,我想在“backbuffer”中进行 GDI 绘图,因此只需要在发生变化时进行。否则我只能渲染缓存的位图。位图是空的和透明的,所以只有绘制的对象应该是可见的。

所以我创建了一个 CompatibleRenderTarget ID2D1BitmapRenderTarget,alpha模式是D2D1_ALPHA_MODE_PREMULTIPLIED

现在我在 CompatibleRenderTarget 中进行 GDI 渲染:

我的渲染函数现在看起来像这样:

现在的问题是,所有 GDI 绘图都是透明的,透明程度取决于底层图像像素的值。深色文本在深色图像背景上显示为深色,但在白色背景上变为白色。但是 GDI 中没有使用 alpha 通道,myBitmap 也没有 alpha 信息。

那么alpha信息是从哪里来的呢?有人有想法吗?提前致谢!

顺便说一句,在 CompatibleRenderTarget 上使用 Direct2D 绘图也可以正常工作。

0 投票
1 回答
2181 浏览

c++ - Win32/Direct2D - 如何渲染无限滚动列表框

我正在使用 C++ 构建一个 Win32 应用程序,它需要显示 Twitter 中相对简单的项目列表。列表中的每个项目都将包括作者和推文文本以及一些图标。在 OS X 上沿着 Twitter 客户端的线条平滑滚动和加速会很好(可能使用 Core Animation 完成)。我只需要支持Windows 7。

我假设我需要创建某种类型的所有者绘制的列表框,该列表框被虚拟化以允许大量项目。有没有一些类似的例子?

我一直在考虑使用 Direct2D 和 DirectWrite,但这些似乎不适合控件开发。我假设这些新技术需要我实施命中测试,因为我将负责渲染每个项目,并且我还必须计算出滚动列表的物理特性。继续研究这个是否明智?有没有人得到 Direct2D 的示例来替代自绘的 Win32 控件。

0 投票
1 回答
372 浏览

c++ - Direct2D - Nothing is being drawn to the screen, something wrong in the way I'm handling arrays in C++

Hello everyone and thank you for looking. This is a follow up to the original question posted here.

I have a base class that I define thusly:

I have two classes that extend this class, both are similar, so I'm listing one:

The DrawShape function is implemented like this:

I want to draw a random number of ellipses and rectangles to the screen, so I first find out those random numbers, create an array of DrawableShape with that size (since I can't allocate objects dynamically in C++), replace the parent objects with the child objects, and then call the draw function on the array, randomly again. Here's what my code looks like:

That should've worked, but it doesn't. Also, after writing this out, I realize that I'm better off creating the array in some sort of init function, and calling the draw on the array in the OnRender function. Please help!!


EDIT: Okay I've got the shapes working with pointers, the problem is the construction of the array. So I have something like this:

That seems to work by itself. How can I create the array of DrawableShape without slicing?

0 投票
1 回答
863 浏览

directx - Directx10:MSAA 最大纹理大小?

在 DirectX 10 中,如何找出给定样本数/质量的 MSAA 纹理的最大纹理大小?

我正在尝试使用 Direct2D 渲染将一些几何图形渲染到 Direct3D MSAA 表面,但对于大型纹理(~5000x2500),我得到了奇怪的结果。如果 MSAA 样本数从 8 减少到 4,一切都会很好地渲染。在创建纹理或渲染时,我没有收到任何错误。

谢谢!

0 投票
1 回答
2895 浏览

c# - C# 中的平滑视频渲染

我正在尝试找到一种在 WPF 中呈现视频的方法,其 CPU 使用率低于 MediaElement。目标是流畅和低 CPU 视频播放,与 C++ 编程中的 Direct3D/DirectDraw 视频渲染一样多。

我尝试使用 Direct2D(使用 WindowsAPICodePack)来渲染视频,结果是 CPU 使用率非常低,但问题是我无法流畅地渲染视频,因为没有像 C++ 中的 DirectX 那样在准确时间更新视频的准确计时器。

也许我需要回到 C++ 世界以原生使用 Direct3D 并在 C# WPF 窗口中使用 DirectX 窗口托管 C++。尽管我不知道会发生什么,但我想这可能值得一试。

如果你们有什么建议,请告诉我。

0 投票
2 回答
1518 浏览

colors - Direct2D 中的颜色衰减/色调

有没有人知道如何在使用 Direct2D 渲染时更改位图的颜色?使用 Direct3D,只需指定不同的顶点颜色,或者在使用 sprite 批处理时,提供一种颜色。我想使用 Direct2D 来做到这一点。提前感谢您的帮助。

0 投票
1 回答
656 浏览

direct2d - 我需要重新创建 Direct2D 可共享资源吗?

根据文档,当渲染目标满足某些条件时,即使是设备相关资源也可以在渲染目标之间共享。

假设我有两个满足这些条件的 RenderTargets(RT1 & RT2)。我使用 RT1 创建一个新的设备相关资源(ResourceA),RT1 和 RT2 都使用这个资源来做一些绘图。

现在,当我完成 RT1 后,我得到 D2DERR_RECREATE_TARGET,这意味着我必须重新创建 RT1 并再次绘制。

我的问题是,我应该重新创建由 RT1 创建的 ResourceA 吗?

0 投票
1 回答
1239 浏览

c# - 选择/挑选应该如何在 Direct2D 中工作?

出于性能原因,我想将我的 C# 应用程序从 GDI+ 移动到 Direct2D(C++/CLI 包装器)。但是我不知道如何解决拾取部分。我有一些可以移动的形状和图像。目前我大部分时间都是用 GraphicsPath.IsVisible 来做的。你知道 Direct2D 中的等价物是什么吗?

0 投票
2 回答
6862 浏览

c++ - Directwrite:获取字体的高度

我的目标: 我想获得 IDWriteTextFormat 字体的高度,这样我就可以计算出在某个高度的 IDWriteTextLayout 中可以容纳多少行文本。

我的问题: 现在我正在使用这段代码来计算可见的行数:

对于某些字体,计算似乎是准确的,但对于任何 TrueType 字体(例如:Courier New、Arial、Times New Roman)都不是。对于这些字体,显示的文本在渲染目标的下垂直边界处被剪裁得很短。

一些上下文: 我正在制作一个文本回滚缓冲区控件,它使用 IDWriteTextLayout 将文本放入控件的呈现目标。我使用 GetVisLines() 的结果来确定要从循环缓冲区(按行将文本存储在 std::strings 中的文本)中的多少行文本拉入布局,并在每次滚动或调整窗口大小时重新创建它。

这是使用“本机”Win32 API C++ 完成的。

0 投票
1 回答
2115 浏览

delphi - 如何在 TcxImage 画布上绘制 Direct2D 画布?

我有一个 Direct2D 演示,它创建一个 GridPatternBitmapBrush 然后在一个绘图方法中在一个 TForm 上绘制网格图案。如何让 Direct2D GridPatternBitmapBrush 出现在表单的 TcxImage.Canvas(DeveloperExpress TImage) 上?