Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.191.223.123] |
|
Сообщ.
#1
,
|
|
|
Привет всем.
Может кто подскажет. Возможно я изначально не правильно пытаюсь решить задачу. Мне нужно из набора картинок построить одну большую картинку. И вроде все получается, но у меня проблемы с альфаканалом. { ID2D1Bitmap* bmp; ... if (bmp) { D2D1_POINT_2U p1 = D2D1::Point2U(point.x, point.y); D2D1_RECT_U r1 = D2D1::RectU(item.X(), item.Y(), item.X() + (float)item.width, item.Y() + (float)item.height); image->bmp->CopyFromBitmap(&p1, bmp, &r1); } } Функция ID2D1Bitmap::CopyFromBitmap отлично отрабатывает и перезаписывает картинку назначения полностью даже альфаканалом источника, тем самым проделывая в картинке назначения "дырку". Вопрос, можно ли как то этого избежать, и оставить фоном картинку назначения в том месте где исходная картинка имеет альфаканал? Прикреплённая картинка
Добавлено на скрине синее отверстие |
Сообщ.
#2
,
|
|
|
D2D я не знаю, в D3D это всё достаточно просто делается в пиксельном шейдере.
А вообще, я когда-то создал SR2D в первую очередь для таких задач. Там можно при желании произвольно комбинировать не только каналы, но даже битовые слои. |
Сообщ.
#3
,
|
|
|
Цитата Mikle @ D2D я не знаю, в D3D это всё достаточно просто делается в пиксельном шейдере. А вообще, я когда-то создал SR2D в первую очередь для таких задач. Там можно при желании произвольно комбинировать не только каналы, но даже битовые слои. спасибо за ссылку на движок, не понял она поставляется как dll, или исходник доступен? нашел решение, не уверен что это правильно, но работает. В общем механизм такой: ID2D1BitmapRenderTarget *bitmapRenderTarget;// создаю новый контекст D2D1_SIZE_F size = D2D1::SizeF(image->Width, image->Height);// с подходящим мне размером Core::GetContext()->CreateCompatibleRenderTarget(size, &bitmapRenderTarget); // Draw onto bitmapRenderTarget bitmapRenderTarget->BeginDraw(); bitmapRenderTarget->Clear(D2D1::ColorF(0.0f, 0.0f, 0.0f)); bitmapRenderTarget->DrawBitmap( // рисую туда одну картинку image->bmp, D2D1::RectF(0, 0, size.width, size.height), //D2D1::RectF(0, 0, image->Width , image->Height ), 1.0f, D2D1_BITMAP_INTERPOLATION_MODE::D2D1_BITMAP_INTERPOLATION_MODE_NEAREST_NEIGHBOR, D2D1::RectF(0.0f, 0.0f, image->Width , image->Height ) ); bitmapRenderTarget->DrawBitmap( // рисую туда вторую картинку bmp, D2D1::RectF(point.x -item.frameX, point.y-item.frameY, point.x + item.Width(), point.y + item.Height()), 1.0f, D2D1_BITMAP_INTERPOLATION_MODE::D2D1_BITMAP_INTERPOLATION_MODE_NEAREST_NEIGHBOR, D2D1::RectF(item.X(), item.Y(), item.X() + (float)item.width, item.Y() + (float)item.height)); bitmapRenderTarget->EndDraw(); image->bmp->Release(); // удаляю исходную картинку bitmapRenderTarget->GetBitmap(&(image->bmp)); // беру за основную картинку то что получилось bitmapRenderTarget->Release(); |
Сообщ.
#4
,
|
|
|
Цитата Юра Железобетон @ не понял она поставляется как dll, или исходник доступен? Распространяется как DLL с портом (модули на соответствующих ЯП), но из исходников DLL я тоже не делаю секрета. |
Сообщ.
#5
,
|
|
|
Цитата Mikle @ Цитата Юра Железобетон @ не понял она поставляется как dll, или исходник доступен? Распространяется как DLL с портом (модули на соответствующих ЯП), но из исходников DLL я тоже не делаю секрета. спасибо, обязательно гляну, я как раз ищу что нибудь для своей игры что бы портировать ее под винфон и т.п. решил пока на directx помучатся ) Добавлено не особо в этом разбираюсь, а эти инструкции асм, будут рабоатьт на arm процах? |
Сообщ.
#6
,
|
|
|
Цитата Юра Железобетон @ а эти инструкции асм, будут рабоатьт на arm процах? Вряд ли Возможно, я в начале неверно понял задачу - я думал, что "нужно из набора картинок построить одну большую картинку" заранее, SR2D предложил, как инструмент для этого, а не как замену движка для игры (если картинки нужно склеивать в процессе). Хотя, конечно, простенькие игры можно делать и на нём. |