ID2D1Bitmap1::地图,什么时候可以使用它

ID2D1Bitmap1::Map, when can you use it?

本文关键字:可以使 地图 ID2D1Bitmap1 什么时候      更新时间:2023-10-16

所以我最近完成并转换了一个我编写的简单测试应用程序,以使用新版本的Direct2D,这意味着我基本上复制了适用于Windows 8的Direct2D Quickstart的相关部分。这起到了作用,因为我的应用程序和以前一样(只是画了一堆像素。)

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

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());

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

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

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

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

D2D1_MAPPED_RECT映射;

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

最近我深入研究了这个问题,并遇到了同样的问题。据我所知,D2D位图不能被锁定以用于CPU写入。更重要的是,你不能创建既用D2D写又用CPU读的位图。

我想读&用CPU和D2D api编写一些字节数组。但不幸的是,我不得不使用两个使用不同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)"