0

所以我最近通过并转换了我编写的一个简单的测试应用程序以使用新版本的 Direct2D,这意味着我基本上复制了Direct2D Quickstart for Windows 8的相关部分。那行得通,因为我的应用程序表现得像以前一样(只是绘制了一堆像素。)

以前,为了更新位图,我正在执行以下操作:

for(int i = 0; i < 1000; ++i )
{
    int x = rand()%600;
    int y = rand()%600;
    int index = 4 * ( x + ( y * 600 ) );
    imageData[index] = rand()%256;
    imageData[index+2] = 0;
}

D2D1_RECT_U rect2 = RectU(0,0,600,600);
pBitmap->CopyFromMemory(&rect2, imageData, 600*4);

其中 imageData 只是:

imageData = new byte[600*600*4];

这仍然有效,但我认为既然我在闪亮的新 ID2D1Bitmap1 接口上有这个漂亮的 Map 方法,我可以摆脱那个 CPU 端数组并执行以下操作:

D2D1_MAPPED_RECT* mapped = NULL;
ThrowIfFailed( pBitmap->Map( D2D1_MAP_OPTIONS_WRITE, mapped ) );

for(int i = 0; i < 1000; ++i)
{
    int x = rand()%600;
    int y = rand()%600;
    int index = 4 * ( x + ( y * 600 ) );
    mapped->bits[index] = rand()%256;
    mapped->bits[index+2] = 0;
}

ThrowIfFailed(pBitmap->Unmap());

这在每次使用 E_INVALIDARG 调用 Map 时都失败了,使用D2D1_BITMAP_PROPERTIES1中传递给 CreateBitmap 的D2D1_BITMAP_OPTIONS和调用 Map 中的D2D1_MAP_OPTIONS的各种组合。

查看D2D1_MAP_OPTIONS 枚举的描述,似乎这 3 个选项(READ、WRITE、DISCARD)实际上都不能用于我使用 Direct2D 上下文创建的位图......

在 Direct2D 中,如何获得可以映射、写入、取消映射和绘制的位图?

4

2 回答 2

1

您的问题是您的映射指针不应该是空指针。我建议根据以下内容更改您的代码:

D2D1_MAPPED_RECT 映射;

ThrowIfFailed(pBitmap->Map(D2D1_MAP_OPTIONS_WRITE, &mapped));

于 2013-02-17T12:39:35.513 回答
0

最近我研究了这个并面临同样的问题。据我了解,D2D 位图无法锁定为 CPU 写入。不仅如此,您无法创建位图以用于使用 D2D 写入和使用 CPU 读取。

我想用 CPU 和 D2D api 读写一些字节数组。但不幸的是,我必须使用 2 个不同的位图bitmapOptions。首先适用于 D2D api,可以作为上下文的渲染目标

props.bitmapOptions = D2D1_BITMAP_OPTIONS_CANNOT_DRAW | D2D1_BITMAP_OPTIONS_TARGET;

秒可以用 CPU 读取

props.bitmapOptions = D2D1_BITMAP_OPTIONS_CANNOT_DRAW | D2D1_BITMAP_OPTIONS_CPU_READ;

使用场景是“将原语渲染到第一个,用于ID2D1Bitmap1::CopyFromBitmap从第二个获取数据(使用 map/unmap)”

于 2015-05-14T09:50:33.133 回答