问题标签 [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.
winapi - 在窗口后面的模糊中清除窗口内容(DWM)
我有一个我调用DwmExtendFrameIntoClientArea()
的窗口,该窗口承载其他子窗口,我使用 Direct2D 在其中一个子窗口上进行绘制,当加载一个具有黑色区域的位图时,该区域变得模糊。我希望清除子窗口中的所有内容并在 上重新绘制WM_PAINT
,但是我似乎无法清除内容。
我试图清除它使用
这会使子窗口区域变黑,它会擦除所有以前的绘图,但没有透明度。
我试图绘制一个位图,它只是客户区上的一个黑条
这使得之前出现的任何东西都变成了黑色。
尝试了在整个子窗口上绘制黑色区域的旧 GDI 方法,
不工作。
但是,如果我不执行任何这些操作并尝试调整主窗口的大小,它会正常工作,即之前的绘画消失了。
在我再次绘制窗口之前,是否有任何 API 调用或任何方法可以手动清除窗口?
visual-c++ - Draw 32-bits with alpha channel from resources using Direct2D
I have a legacy MCF application that displays some images (bmp 32-bits with alpha channel information) by pre-multiplying the images and using CDC::AlphaBlend
method.
I would like to introduce some new graphics using Direct2D but I don't want to migrate all the images to png or other formats.
I managed to draw a bmp image from a file but I'm facing problems to get the image from resources and also the displayed image does not use the alpha channel information.
So could anybody help me out with this?
This is my code to create the bitmap:
This is the code to draw the bitmap:
c++ - 如何在 D2D 中执行整个屏幕的“廉价”比例?
我正在开发一个触摸屏应用程序 (WinRT),目前在屏幕上绘制一些图形。因为它是触摸的,所以我想启用双指缩放来缩放整个内容。为了获得更好的体验,我只想在捏合手势完成后重新绘制图形。对于中间缩放,我想重用当前位图,并执行(如果可能)仅 gpu 缩放(放大位图)。基本上,我想做 iOS 和 Windows Phone 多年来一直在做的事情。
如何在 Direct2D 中实现这一点?
作为奖励,如果您知道有关 Direct2D 阅读的好资源,请告诉我。MSDN 文档真的很差,我必须寻找不同的博客和杂志文章来学习:(
到目前为止我尝试了什么:
但是,如果我对交互式元素(如页面放大/缩小)执行此操作,则会呈现所有对象(这也很慢)。另一种选择是绘制 BITMAP 并将其用作转换的基础。但是,我不确定这是否是一个好方法。注意:我目前正在台式机上调试,但想针对平板电脑。我不得不考虑平板电脑要慢几个数量级。这就是我尝试优化此功能的原因。
谢谢!
direct3d - ID3D10Texture2D 滚动内容
我是 DirectX 技术的新手。
如何滚动 ID3D10Texture2D 的内容?使用bitblt。GDI 设备上下文中的 BitBlt 之类的东西,其中 src 和 dst hdc 相同。
我有来自 IDXGISurface 的 ID3D10Texture2D 滚动是我真正的目标,但在 dxgi api 中找不到任何东西。
graphics - 沿几何路径的 Direct2D 渐变
在 D2D 中,有没有办法创建使用自定义路径几何作为其起点/终点的渐变画笔?我可以用简单的方法为路径的每一步创建一个不同的画笔,并使用该画笔将其渲染为单独的路径,但我正在寻找不会影响性能的东西。
谢谢!
c++ - 如何使用 Direct2D 创建自定义窗口镶边?
在查看了 MSDN 入门指南和 API 参考之后,我对 Direct2D 非常陌生,在我看来,如果您想使用带有消息泵和 HWND 的标准 winAPI C++ GUI 模型,则只有 CreateHwndRenderTarget()。
但是,CreateHwndRenderTarget() 只渲染到客户区。如果可能的话,我想绘制自己的窗口镶边并在标题栏中设置控件。我如何为此使用 Direct2D?
c++ - IWICImagingFactory::CreateDecoderFromStream() 失败,错误消息消息没有帮助
我正在尝试从位图资源加载 ID2D1Bitmap。为此,我查阅了MSDN 指南,该指南告诉我在 Direct2D 使用图像之前使用 Windows 映像组件 (IWIC) 处理图像。
但是,当我调用它时它失败CreateDecoderFromStream()
了,它返回了一条奇怪的错误消息——0x88982f50
它什么也没告诉我。我搜索了谷歌并使用了 DirectX 错误查找。DirectX 错误查找工具只告诉我:
这是我用来尝试从资源加载 ID2D1Bitmap 的代码:
c++ - Direct2D 拒绝在窗口上绘制位图,静默失败
我正在尝试使用 Direct2D 将 128x128 位图绘制到窗口上。但是,什么都没有显示,EndDraw()
也没有返回任何错误。
这是我的WM_PAINT
代码:
我怀疑这可能是因为我从 Visual Studio 资源加载的位图数据是垃圾,但我无法知道,因为没有任何失败并给出错误消息。这是我用来ID2D1Bitmap
从资源加载的代码:
我在 Visual Studio 2010 中使用 C++ 和本机 WinAPI。
c# - .NET 和 Direct2D 快速绘制崩溃
一般用途
我正在开发一个可用于使用 Direct2D 进行多用途图形渲染的 .NET 用户控件。此控件基于ID2D1HwndRenderTarget
带有ID2D1BitmapRenderTarget
后备缓冲区/双缓冲区的接口。
背景
我已经使用 C++/CLI 编写了一个包装器,它为 Direct2D 公开了一组托管包装器对象,并且我为 Direct2D 位图设计了一个单例资源管理器,代码可以将二进制数据发送到该位图,并从中获取资源密钥,然后哪些代码可以将消息传递给用户控件以呈现位图。
到目前为止的使用情况
我已经能够毫无问题地加载位图、JPEG、自定义图像格式等并将它们发送到 Direct2D 渲染控件。我编写了一个自定义视频解码器,它可以从 15-fps 视频中加载帧(在后台线程中解码)并从 Win32 多媒体计时器引发的事件中渲染它们,没问题。
问题
我的问题是,当我尝试从单一多媒体格式扩展到更灵活的格式(特别是连接到 LibAV/ffmpeg)时,Direct2D 渲染控件开始使显示驱动程序崩溃。当帧按顺序渲染时(使用按钮来渲染下一帧,而不是计时器),这不会发生。它也不会立即发生。当我在 Win32 计时器回调内部阻塞时也不会发生这种情况,但是当我使用互斥锁引发一个线程时,它将释放计时器回调并让临时线程指示控件呈现。
症状
如果我启动一个计时器并将其附加到将导致下一次渲染的已用事件方法,它通常会正常播放大约 2-20 秒。使用较小的视频,我可以在问题开始之前获得更长的播放时间。如果我播放 1080p 视频,我通常可以在 5 秒内获得崩溃而无需竞争。播放将开始正常,在赶上之前可能会在这里或那里打嗝。
- 最终,我会开始看到闪烁,好像背景颜色已渲染但框架未渲染。其他帧可能会或可能不会稍后渲染,但这是非常短暂的。
- 闪烁后,如果我足够快地停止计时器,就不会发生崩溃。
- 如果我不及时停止:
- 如果我很幸运(可能有 10% 的时间),帧将停止渲染,停留在一帧上,直到我调整控件的大小,此时整个控件只绘制黑色。(我读到这可能表明 DirectX 渲染的设备上下文丢失,但还没有看到更多。)
- 如果我不走运,显示驱动程序会崩溃,Windows 会恢复并重新启动驱动程序,之后 EndDraw 将最终告诉我发生错误并返回 D2DERR_RECREATE_TARGET。
- 如果我真的不走运,显示器将开始看起来像万花筒,我将不得不关闭我的机器,我只是浪费了 5 分钟的时间来启动、登录、加载 Visual Studio 和我的解决方案、加载视频并丢失了所有我的调试数据。
我想认为我缺少某种竞争条件,但是每次我运行渲染代码时,它似乎都应该被正确锁定。
渲染控件的代码
Win32多媒体定时器回调代码
排除大小,但这里是相关代码,链接到“winmm.dll”,EntryPoint = “timeSetEvent”
结论
3 周后,我并不羞于说我对这种行为感到困惑,并寻找任何类型的输入来识别竞争条件,从架构上讲,我可能会遗漏关于 Direc2D 或我只是在哪里显示我的无知。
opengl - 每个垂直同步如何准确地进行一次渲染(不重复,不跳过)?
我正在尝试进行垂直同步渲染,以便每次垂直同步完成一次渲染,而不会跳过或重复任何帧。我需要它在 Windows 7 和(将来)Windows 8 下工作。
它基本上包括绘制QUADS
适合屏幕的序列,以便原始图像中的像素与屏幕上的像素 1:1 匹配。无论是使用 OpenGL 还是 DirectX,渲染部分都不是问题。问题是正确的同步。
我以前尝试使用带有WGL_EXT_swap_control
扩展名的 OpenGL,通过绘制然后调用
我尝试了这两条指令的所有组合和排列以及 glFlush(),但它并不可靠。
然后我尝试使用 Direct3D 10,通过绘图然后调用
其中g_pSwapChain
a是IDXGISwapChain*
与该 SwapChain 关联的。pOutput
IDXGIOutput*
OpenGL 和 Direct3D 这两个版本的结果是一样的:第一个序列,比如 60 帧,并没有持续应有的时间(而不是在 60hz 下大约 1000 毫秒,而是持续大约 1030 或 1050 毫秒),以下的似乎工作正常(大约 1000.40 毫秒),但它似乎时不时地跳过一帧。我用 进行测量QueryPerformanceCounter
。
在 Direct3D 上,仅尝试 WaitForVBlank 循环,1000 次迭代的持续时间始终为 1000.40,几乎没有变化。
所以这里的麻烦是不知道每个调用的函数何时返回,以及交换是否在垂直同步期间完成(不是更早,以避免撕裂)。
理想情况下(如果我没记错的话),要实现我想要的,应该是执行一次渲染,等到同步开始,在同步期间交换,然后等到同步完成。如何使用 OpenGL 或 DirectX 做到这一点?
编辑:只有 60 倍
的测试循环WaitForVSync
需要从 1000.30 毫秒到 1000.50 毫秒。Present(1,0)
与before相同的循环WaitForVSync
,没有其他内容,没有渲染,花费相同的时间,但有时它会失败并花费 1017 毫秒,就好像重复了一帧一样。没有渲染,所以这里有问题。