На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела "Программирование графики"
1) Данный раздел предназначен для обсуждения проблем, возникающих при программировании задач, связанных с чтением, сохранением, обработкой, созданием, отрисовкой графической информации (в том числе - 3D [OpenGL, Direct3D] и анимации [в т.ч. VFW, DirectShow, OpenDML]).
Флэш обсуждают здесь!.

2) Если вы хотите получить совет для конкретной платформы/языка программирования, обязательно укажите их в вопросе.

3) Уважаемые новички! Мы приветствуем Ваше желание научить всех посетителей раздела правильному программированию. Но огромная просьба, перед тем, как писать поучения в старых (последний ответ - "старее" месяца, а особенно, если вопрошавший не появляется на форуме уже не первый месяц, в чем можно убедиться в его профиле) темах, хорошо подумать, будет ли кому-нибудь, кроме Вас cамих, это интересно.



Ваше мнение о модераторах: user posted imageBarazuk, user posted imageOpenGL, user posted imageMikle
Модераторы: OpenGL, Mikle
  
> direct2d копирование картинки в картинку
    Привет всем.
    Может кто подскажет. Возможно я изначально не правильно пытаюсь решить задачу. Мне нужно из набора картинок построить одну большую картинку. И вроде все получается, но у меня проблемы с альфаканалом.

    ExpandedWrap disabled
      {
      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 отлично отрабатывает и перезаписывает картинку назначения полностью даже альфаканалом источника, тем самым проделывая в картинке назначения "дырку". Вопрос, можно ли как то этого избежать, и оставить фоном картинку назначения в том месте где исходная картинка имеет альфаканал?

    Прикреплённая картинка
    Прикреплённая картинка


    Добавлено
    на скрине синее отверстие
      D2D я не знаю, в D3D это всё достаточно просто делается в пиксельном шейдере.
      А вообще, я когда-то создал SR2D в первую очередь для таких задач. Там можно при желании произвольно комбинировать не только каналы, но даже битовые слои.
        Цитата Mikle @
        D2D я не знаю, в D3D это всё достаточно просто делается в пиксельном шейдере.
        А вообще, я когда-то создал SR2D в первую очередь для таких задач. Там можно при желании произвольно комбинировать не только каналы, но даже битовые слои.

        спасибо за ссылку на движок, не понял она поставляется как dll, или исходник доступен?

        нашел решение, не уверен что это правильно, но работает.

        В общем механизм такой:

        ExpandedWrap disabled
          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();
          Цитата Юра Железобетон @
          не понял она поставляется как dll, или исходник доступен?

          Распространяется как DLL с портом (модули на соответствующих ЯП), но из исходников DLL я тоже не делаю секрета.
            Цитата Mikle @
            Цитата Юра Железобетон @
            не понял она поставляется как dll, или исходник доступен?

            Распространяется как DLL с портом (модули на соответствующих ЯП), но из исходников DLL я тоже не делаю секрета.

            спасибо, обязательно гляну, я как раз ищу что нибудь для своей игры что бы портировать ее под винфон и т.п. решил пока на directx помучатся )

            Добавлено
            не особо в этом разбираюсь, а эти инструкции асм, будут рабоатьт на arm процах?
              Цитата Юра Железобетон @
              а эти инструкции асм, будут рабоатьт на arm процах?

              Вряд ли :)
              Возможно, я в начале неверно понял задачу - я думал, что "нужно из набора картинок построить одну большую картинку" заранее, SR2D предложил, как инструмент для этого, а не как замену движка для игры (если картинки нужно склеивать в процессе). Хотя, конечно, простенькие игры можно делать и на нём.
              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
              0 пользователей:


              Рейтинг@Mail.ru
              [ Script Execution time: 0,1262 ]   [ 19 queries used ]   [ Generated: 6.12.19, 17:40 GMT ]