有人能提供一个使用Direct2D处理像素的有效方法的例子吗?
例如,如何将渲染目标上的所有绿色像素(RGB = 0x00FF00)替换为红色像素(RGB = 0xFF0000)?标准方法是什么?有可能使用ID2D1HwndRenderTarget吗?这里我假设使用某种硬件加速。我应该为直接像素操作创建一个不同的对象吗?
使用DirectDraw,我将在带有逻辑操作的IDirectDrawSurface7上使用BltFast方法。Direct2D有类似的地方吗?
另一个任务是动态生成复杂的图像,其中每个点、位置和颜色都是一个数学函数的结果。作为一个例子,让我们简化所有内容并绘制Y = X ^ 2。如何在Direct2D中做到这一点?最终,我需要绘制复杂的函数,但是如果有人可以给我一个简单的Y = X ^ 2示例。
发布于 2012-02-21 21:47:41
首先,它有助于将ID2D1Bitmap视为“设备位图”。它可能存在于本地的CPU可寻址内存中,也可能不存在于CPU可寻址内存中,而且它也不能为您提供从总线CPU侧读取/写入像素的任何方便(或至少是快速)的方法。所以从这个角度接近可能是错误的。
我认为您需要的是一个常规的WIC位图,IWICBitmap,您可以用IWICImagingFactory::CreateBitmap()创建它。从这里,您可以调用Lock()来获取缓冲区,然后使用指针进行读/写,并执行您想做的任何事情。然后,当您需要在屏幕上用Direct2D绘制它时,使用ID2D1RenderTarget::CreateBitmap()创建一个新的设备位图,或者使用ID2D1位图::CopyFromMemory()更新现有的设备位图。还可以通过使用ID2D1Factory:CreateWicBitmapRenderTarget()(而不是硬件加速)将其呈现到IWICBitmap中。
对于这些类型的操作,您不会得到硬件加速。更新后的Direct2D in Win8 (最终也应该可以用于Win7 )有一些非常复杂的内容,但是看起来相当复杂。
发布于 2014-03-06 06:59:54
Rick的回答谈到了如果您不关心丢失硬件加速时可以使用的方法。我关注的是如何使用大量的GPU加速来完成这个任务。
为了使渲染硬件加速并获得最佳性能,您需要从ID2DHwndRenderTarget切换到使用更新的ID2DDevice和ID2DDeviceContext接口。老实说,它并没有为您的代码添加更多的逻辑,而且性能方面的好处也是巨大的。它还可以在Windows 7上使用Platform Update。总结这一进程:
一旦您这样做了,您已经解锁了许多可能的解决方案。解决您的确切问题(交换颜色通道)的最简单和最有效的方法可能是使用色矩阵效应作为所提到的其他答案之一。但是,重要的是要认识到需要使用更新的ID2DDeviceContext接口而不是ID2DHwndRenderTarget来实现这一点。如果你愿意的话,还有很多其他的效果可以做更复杂的操作。以下是一些最有用的简单像素操作方法:
通常,为了解决直接操作像素而不降低硬件加速或执行大量复制的问题,有两种选择。第一种方法是编写像素着色器,并将其包装成完全自定义的D2D效果。这不仅仅是在CPU上获得像素缓冲区和进行老式的比特混搭,但是在GPU上这样做要快得多。D2D效果框架还使得将您的效果用于其他目的、将其与其他效果结合起来非常简单,等等。
对于那些你绝对需要做CPU像素操作,但仍然需要很大程度的加速的时候,你可以管理你自己的可映射的D3D11纹理。例如,如果要从CPU异步操作纹理资源,可以使用暂存纹理。还有更详细的另一个答案。有关详细信息,请参阅ID3D11Texture2D。
发布于 2013-08-28 14:59:03
使用红色像素交换所有绿色像素的具体问题可以通过Windows8的ID2D1Effect和Windows7的平台更新来解决。
更具体地说,色矩阵效应
https://stackoverflow.com/questions/9021244
复制相似问题