Итак, я недавно прошел и преобразовал простое тестовое приложение, которое я написал, чтобы использовать новую версию Direct2D, что означает, что я в основном скопировал соответствующие части Direct2D Quickstart для 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];
Это все еще работало, но я подумал, что, поскольку у меня есть отличный метод Map в моем блестящем новом интерфейсе ID2D1Bitmap1, я могу избавиться от этого массива на стороне процессора и сделать что-то вроде:
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());
Это не удавалось при вызове Map с E_INVALIDARG, каждый раз, используя различные комбинации D2D1_BITMAP_OPTIONS в D2D1_BITMAP_PROPERTIES1 передается CreateBitmap и D2D1_MAP_OPTIONS в звонке на карту.
Глядя на описание Перечисление D2D1_MAP_OPTIONS похоже, что ни одна из 3 опций (READ, WRITE, DISCARD) не может быть использована на битовых картах, которые я создаю в контексте Direct2D …
Как получить в Direct2D растровое изображение, которое я могу отображать, записывать, удалять и рисовать?
Ваша проблема в том, что ваш сопоставленный указатель не должен быть нулевым указателем. Я предлагаю изменить ваш код в соответствии со следующим:
D2D1_MAPPED_RECT сопоставлен;
ThrowIfFailed (pBitmap-> Map (D2D1_MAP_OPTIONS_WRITE, &картируется));
Недавно я копался в этом и столкнулся с той же проблемой. Насколько я понимаю, D2D Bitmap нельзя заблокировать для записи на процессор. Более того, вы не можете создавать растровые изображения как для записи в D2D, так и для чтения в CPU.
И я хотел бы прочитать&написать некоторый байтовый массив с процессором и D2D API. Но, к сожалению, я должен использовать 2 растровых изображения, созданные с разными bitmapOptions
, Сначала подходит для API D2D и может быть целью для контекста
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
получить данные со второго (с картой / без карты) «