标签: direct2d

如何使用Direct2D处理像素

有人可以提供使用Direct2D处理像素的有效方法的示例吗?

例如,如何在渲染目标上交换所有绿色像素(RGB = 0x00FF00)和红色像素(RGB = 0xFF0000)?标准方法是什么?有可能ID2D1HwndRenderTarget用于此吗?在这里,我假设使用某种硬件加速.我应该为直接像素操作创建不同的对象吗?

使用DirectDraw我会BltFastIDirectDrawSurface7with逻辑操作上使用方法.Direct2D有类似的东西吗?

另一个任务是动态生成复杂图像,其中每个点位置和颜色是数学函数的结果.为了举个例子,让我们简化一切并画出Y = X ^ 2.如何用Direct2D做到这一点?最终我需要绘制复杂的函数,但如果有人能给我一个简单的例子Y = X ^ 2.

directdraw direct2d

6
推荐指数
2
解决办法
9055
查看次数

在通过SharpDX渲染Direct2D图像时,如何使用内存流而不是文件?

设置

考虑给定的临时程序使用SharpDX(Direct*库的托管包装器)来渲染位图并将其保存为PNG:

namespace ConsoleApplication5
{
    using System;
    using System.Diagnostics;
    using System.IO;
    using SharpDX;
    using SharpDX.Direct2D1;
    using SharpDX.DirectWrite;
    using SharpDX.DXGI;
    using SharpDX.IO;
    using SharpDX.WIC;
    using AlphaMode = SharpDX.Direct2D1.AlphaMode;
    using Bitmap = SharpDX.WIC.Bitmap;
    using D2DPixelFormat = SharpDX.Direct2D1.PixelFormat;
    using WicPixelFormat = SharpDX.WIC.PixelFormat;

    class Program
    {
        static void Main(string[] args)
        {
            var width = 400;
            var height = 100;
            var pixelFormat = WicPixelFormat.Format32bppBGR;

            var wicFactory = new ImagingFactory();
            var dddFactory = new SharpDX.Direct2D1.Factory();
            var dwFactory = new SharpDX.DirectWrite.Factory();

            var wicBitmap = new …
Run Code Online (Sandbox Code Playgroud)

asp.net direct2d sharpdx

6
推荐指数
1
解决办法
2399
查看次数

ID2D1HwndRenderTarget始终具有黑色背景而不是透明

我正在尝试创建一个简单的透明窗口,我可以使用Direct2D绘制.

到目前为止我做了什么:

  1. 创建窗口
  2. 将样式设置为WS_EX_LAYERED
  3. 将alpha颜色键设置为#FFF
  4. 使用Windows Graphics绘制一个白色矩形
  5. 现在窗口是透明的,每像素alpha
  6. 然后从窗口中制作目标并使用Direct2D绘制
    • 制作ALPHA _PREMULIPLIED目标
    • 用#FFF清除0.0f alpha
  7. 窗口现在是黑色的

我只是不知道如何使窗口透明.如果你能指出我的错误,我将被迫

c c++ user-interface mfc direct2d

6
推荐指数
2
解决办法
1005
查看次数

UI动画的标准方式是什么?

我工作的一个搭载UI库D2D,DWriteWic为(SDK API)本机C++桌面应用程序 (如无XAML,没有WinRT的,只是老派C++) .我已准备好编写一个无窗口UI,为我的工具提供更现代的(如本世纪的外观)C++.

我是一名内心的后卫,所以我花了很少的时间在UI上,并且大部分都与Windows标准和通用控件以及一些自定义绘制的GDI东西进行了交互.无论如何,没有什么花哨的.

我正在尝试,D2D我有兴趣了解UI动画的标准方法.就像当你将鼠标悬停在一个按钮上,使边框发光一点,或者一个UI元素由于交互而平滑移动,或者某些东西从屏幕上消失.(想想jQuery在UX的经济中褪色,滑动和如此短暂但有意义的动画)

考虑到这一点,我想到了两种处理UI动画的方法:

  • 一个独立的线程处理的动画队列中的计算,而UI线程绘制的结果.每次交互都会将动画作业放入队列中,线程会计算内容并在元素被绘制之前重新定位元素.
  • 使用相同的线程计时器来安排和迭代动画.

备用线程工作者方法似乎是一个好方法......但需要一点互锁时可视属性已更新,所以它不会发生,而实际绘制,以保持一致性.

现在,对于单线程UI ...定时器似乎是解决方案.这样可以确保绘图不会与动画计算重叠.但对我来说,感觉很尴尬.我不习惯单线生活方式.:)

还有另外一种方法吗?或者推荐哪种方法?我很欣赏有关现有实施细节或阅读材料的任何信息.

PS:如果downvoters或那些请求关闭的人实际上有理由,我会很感激.(1)如果你不知道我在问什么,那就继续......这绝对不是你的问题.(2)如果这对你来说太明显/简单,那就回答吧.---除非你是巨魔,否则我没有看到第三个原因.---或者这是一个非常愚蠢的问题,但正如我所说,我是十年+后卫,所以我可以逃脱它.

c++ windows user-interface animation direct2d

6
推荐指数
1
解决办法
3933
查看次数

调整绑定到 Direct2D 渲染目标的 DXGI 交换链的大小

我有一个使用 ID2D1Factory::CreateDxgiSurfaceRenderTarget 创建的 Direct2D 渲染目标。当我收到 WM_SIZE 消息时,我尝试通过调用 IDXGISwapChain::ResizeBuffers 来调整相应交换链的大小,但失败并显示 DXGI_ERROR_INVALID_CALL (0x887a0001)。我相信这是因为ResizeBuffers 文档中指出的以下内容:

除非释放对其后台缓冲区的所有未完成引用,否则无法调整交换链的大小。为了使 ResizeBuffers 成功,您必须释放其对后台缓冲区的所有直接和间接引用。

在对资源调用 AddRef 后,应用程序将保留直接引用。

间接引用由对资源的视图持有,将资源的视图绑定到设备上下文、使用该资源的命令列表、使用该资源的视图的命令列表、执行使用过的另一个命令列表的命令列表。资源等等。

我假设由 ID2D1RenderTarget::CreateDxgiSurfaceRenderTarget 创建的 Direct2D 渲染目标就是这样一种间接引用。但我无法想象每次调整窗口大小时都应该重新创建渲染目标,那么我该怎么办?

c++ direct3d direct2d dxgi

6
推荐指数
1
解决办法
2015
查看次数

每个监视器DPI-Aware:使用NVIDIA Optimus的黑色窗口故障

我想制作一个Per-Monitor DPI-Aware Direct2D应用程序.我已按照Kenny Kerr的MSDN文章中的解释,扩展了Microsoft的"First Direct2D Program"示例.当两台显示器都使用一块显卡时,这种方法很有效,但在使用我的笔记本电脑的NVIDIA Optimus设置时会出现故障.WM_DPICHANGED

我可以通过以下步骤运行Per-Monitor Aware WPF示例来重现相同的故障:

  • 每台显示器上的DPI比例因子不同.
  • 支持Optimus(集成显卡上的笔记本电脑显示,Quadro显卡上的外接显示器)
  • 应用程序在主显示屏上启动 - 右侧的外部显示器.
  • 将其拖到左侧,它可以正确处理DPI更改.
  • 将其拖回右侧.当它处理DPI更改时,右侧监视器上的窗口部分变为黑色.左侧部分仍然正确绘制.

(见这个bug的视频)

我只是在上面的示例应用程序中看到了这个错误,当我尝试将Kerr的WM_DPICHANGED处理程序添加到一个更简单的示例时.可疑的是,我已经看到其他应用程序(Chrome,Visual Studio本身)显示类似的黑色窗口,但只是暂时的,如果我在显示器之间拖动并且非常快速地最大化它们.

那么 - 是否有人熟悉这个故障?是我的显示驱动程序中的一些错误?或者是否有其他应用程序要做的事情来纠正它,示例代码没有?

c++ winapi multiple-monitors direct2d optimus

6
推荐指数
1
解决办法
397
查看次数

C#如何提高Direct2D绘图的效率

早上好,

我已经在C#中教自己一些Direct2D编程,利用可用的本机包装程序(当前使用d2dSharp,但也尝试过SharpDX)。但是,我遇到了效率问题,在这种情况下,基本绘图Direct2D绘图方法大约需要250毫秒才能绘制45,000个基本多边形。我所看到的性能与Windows GDI +相当,甚至更低。我希望有人可以看看我所做的事情,并提出一种可以极大地缩短绘画时间的方法。

这样做的背景是我有一个个人项目,正在开发一个基本但功能强大的CAD界面,该界面能够执行各种任务,包括2D有限元分析。为了使它完全有用,该界面需要能够显示数以万计的基本元素(多边形,圆形,矩形,点,弧形等)。

最初,我是使用Windows GDI +(System.Drawing)编写绘图方法的,直到在任何给定时间在屏幕上达到大约3,000个元素之前,性能都相当不错。用户每次平移,缩放,绘制新元素,删除元素,移动,旋转等时,都必须更新屏幕。现在,为了提高效率,我利用四叉树数据结构来存储我的元素,而我只绘制实际在控制窗口范围内的元素。这在放大时有很大帮助,但是很明显,在完全缩小并显示所有元素时,没有什么区别。我还使用计时器和刻度事件以刷新率(60 Hz)更新屏幕,因此我没有尝试每秒或每次鼠标事件更新数千次。

这是我第一次使用DirectX和Direct2D进行编程,因此我肯定在这里学习。话虽如此,我已经花了几天的时间回顾教程,示例和论坛,但发现没有什么帮助。我尝试了十二种不同的绘制,预处理,多线程等方法。我的代码如下

代码遍历和绘制元素

List<IDrawingElement> elementsInBounds = GetElementsInDraftingWindow();

_d2dContainer.Target.BeginDraw();
_d2dContainer.Target.Clear(ColorD2D.FromKnown(Colors.White, 1));

if (elementsInBounds.Count > 0)
{
    Stopwatch watch = new Stopwatch();
    watch.Start();

    #region Using Drawing Element DrawDX Method

    foreach (IDrawingElement elem in elementsInBounds)
    {
        elem.DrawDX(ref _d2dContainer.Target, ref _d2dContainer.Factory, ZeroPoint, DrawingScale, _selectedElementBrush, _selectedElementPointBrush);
    }

    #endregion

    watch.Stop();
    double drawingTime = watch.ElapsedMilliseconds;
    Console.WriteLine("DirectX drawing time = " + drawingTime);
    watch.Reset();
    watch.Start();

    Matrix3x2 scale = Matrix3x2.Scale(new SizeFD2D((float)DrawingScale, (float)DrawingScale), new PointFD2D(0, 0));
    Matrix3x2 translate = Matrix3x2.Translation((float)ZeroPoint.X, (float)ZeroPoint.Y);

    _d2dContainer.Target.Transform …
Run Code Online (Sandbox Code Playgroud)

c# direct2d

6
推荐指数
1
解决办法
672
查看次数

Skia 或 Direct2D 如何使用 GPU 渲染线条或多边形?

这是一道了解2d矢量图形GPU加速渲染原理的题。

使用 Skia 或 Direct2D,您可以绘制圆角矩形、贝塞尔曲线、多边形等,并且还可以产生模糊等效果。

Skia / Direct2D 提供基于 CPU 和 GPU 的渲染。

对于CPU渲染,我或多或少可以想象如何渲染圆角矩形。我已经见过很多不同的线条渲染算法。

但对于GPU,我没有太多线索。

  • 圆角矩形是由三角形组成的吗?
  • 圆角矩形是否完全由野生像素着色器绘制?

是否有一些基本示例可以向我展示此类事物如何工作的基本原理?

(也许,解决方案也可以在 Skia 的源代码中找到,但我担心它会如此复杂/通用,以至于像我这样的菜鸟什么都看不懂。)

graphics rendering gpu direct2d skia

6
推荐指数
1
解决办法
947
查看次数

GDI 渲染到 direct2D ID2D1BitmapRenderTarget 总是透明的

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

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

HwdRenderTarget.BeginDraw;
HwdRenderTarget.DrawBitMap(myBitMap);
HwdRenderTarget.GetDC(dc);

... do GDI drawing here ...

HwdRenderTarget.ReleaseDC();
HwdRenderTarget.EndDraw;
Run Code Online (Sandbox Code Playgroud)

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

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

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

 HwdRenderTarget.CreateCompatibleRenderTarget(nil, nil, nil, D2D1_COMPATIBLE_RENDER_TARGET_OPTIONS_GDI_COMPATIBLE, CompatibleRenderTarget);
Run Code Online (Sandbox Code Playgroud)

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

CompatibleRenderTarget.BeginDraw;
if Supports(CompatibleRenderTarget, ID2D1GdiInteropRenderTarget, GdiInteropRenderTarget) then
begin
  GdiInteropRenderTarget.GetDC(D2D1_DC_INITIALIZE_MODE_CLEAR, dc);

  ... do GDI drawing here ...

  GdiInteropRenderTarget.ReleaseDC(fDstSize);
end;
GdiInteropRenderTarget := nil;
CompatibleRenderTarget.EndDraw;
CompatibleRenderTarget.GetBitmap(BackBuffer); …
Run Code Online (Sandbox Code Playgroud)

transparency gdi direct2d rendertarget

5
推荐指数
1
解决办法
3001
查看次数

如何在 Direct2D 中创建透明位图

我需要使用 Direct2D 创建一个透明位图,并使用我的设备上下文在其上绘制。

ID2D1DeviceContext1* d2dContext = ...
ID2D1Bitmap* pBitmap;

d2dContext->CreateBitmap(
    bitmapSize,
    nullptr,
    0,
    D2D1::BitmapProperties1(
        D2D1_BITMAP_OPTIONS_TARGET,
        D2D1::PixelFormat(DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_PREMULTIPLIED),
        dpiX, dpiY),
    &pBitmap);

d2dContext->BeginDraw();
d2dContext->SetTarget(pBitmap);
d2dContext->Clear(D2D1::ColorF(0, 0));
d2dContext->DrawLine(...);
hr = d2dContext->EndDraw();
Run Code Online (Sandbox Code Playgroud)

不幸的是我无法创建任何透明位图。我尝试了几种像素格式组合,包括D2D1_ALPHA_MODE_STRAIGHT,但没有成功。

有什么解决办法吗?

c++ directx transparency direct2d pixelformat

5
推荐指数
1
解决办法
3520
查看次数