На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА 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, рисование в память и его вывод
    Рисуется схема (линии, фигурки), цветом раскрашиваются, вообщем графическое состояние чего-то.
    Изменения НЕ реал тайм (т.е. может измеряться секундами/минутами).
    Хочется реализовать так:
    1) Схема рисуется в память, когда происходит ее логическое изменение.
    2) При работе с окном программы: перемещение схемы, изменение размера окна или масштаба схемы, использовался ранее нарисованный растр, как будто это уже готовая картинка.

    Рисование происходит через вызов методов CHwndRenderTarget. Была идея создать такой объект, но он привязывается к окну и как с него вывести тоже не нашел.
    Еще посещает мысли, чтоб создать какой-нибудь bitmap и в него рисовать, а потом его выводить как готовую картинку, но тоже пока ничего толкового не нашел.
    Сообщение отредактировано: Black_Dragon -
      Вообщем сделал так.
      OnUpdate
      ExpandedWrap disabled
        m_pBRender = new CBitmapRenderTarget();
        GetRenderTarget()->CreateCompatibleRenderTarget(*m_pBRender, CD2DSizeF(sizeTotal.cx, sizeTotal.cy));
        CRect rect(0, 0, sizeTotal.cx, sizeTotal.cy);
        m_pLinearGradientBrush->SetEndPoint(CPoint(sizeTotal.cx, sizeTotal.cy));
        D2D1_ROUNDED_RECT r = D2D1::RoundedRect(D2D1::RectF(10.f, 10.f, 100.f, 50.f), 10.f, 10.f);
        m_pBRender->BeginDraw();
         
        m_pBRender->FillRectangle(rect, m_pLinearGradientBrush);
        m_pBRender->DrawRoundedRectangle(r, m_pBrushLine, 5.0f);
        m_pBRender->FillRoundedRectangle(r, m_pBrushBG);
        m_pBRender->DrawText(_T("Hello, World!"), CRect(10, 100, 100, 150), m_pBlackBrush, m_pTextFormat);
        CD2DPointF pStart, pEnd;
        pStart.x = sizeTotal.cx / 2;
        pStart.y = sizeTotal.cy / 2;
        int count = 20;
        FLOAT len = min(sizeTotal.cx, sizeTotal.cy) / 3;
        CD2DSizeF ell_r(5.0f, 5.0f);
        for (int i = 0; i < count; ++i)
        {
            FLOAT angle = 2 * M_PI * ((FLOAT) i) / ((FLOAT) count);
            pEnd.x = pStart.x + len * cosf(angle);
            pEnd.y = pStart.y + len * sinf(angle);
            m_pBRender->DrawLine(pStart, pEnd, m_pBrushLine, 1.0f);
            CD2DEllipse ell(pEnd, ell_r);
         
            m_pBRender->DrawEllipse(ell, m_pBrushLine, 4.0f);
            m_pBRender->FillEllipse(ell, m_pBrushBG);
        }
         
        m_pBRender->Flush();
        m_pBRender->EndDraw();
         
        SetScrollSizes(MM_TEXT, sizeTotal);
        CScrollView::OnUpdate(pSender, lHint, pHint);


      OnDraw2D
      ExpandedWrap disabled
        CPoint point = GetScrollPosition();
         
        // apply translation transform according to view's scroll position
        D2D1_MATRIX_3X2_F matrix = D2D1::Matrix3x2F::Translation((float) -point.x, (float) -point.y);
        pRenderTarget->SetTransform(matrix);
         
        //CRect rect(0, 0, sizeTotal.cx, sizeTotal.cy);
        //m_pLinearGradientBrush->SetEndPoint(CPoint(sizeTotal.cx, sizeTotal.cy));
        //pRenderTarget->FillRectangle(rect, m_pLinearGradientBrush);
         
        CD2DBitmap BM(pRenderTarget, _T(""));
        m_pBRender->GetBitmap(BM);
        CD2DSizeF size = BM.GetSize();
        pRenderTarget->DrawBitmap(&BM, CD2DRectF(0, 0, sizeTotal.cx, sizeTotal.cy));
         
        D2D1_ROUNDED_RECT r = D2D1::RoundedRect(D2D1::RectF(110, 10.f, 200.f, 50.f), 10.f, 10.f);
        pRenderTarget->DrawRoundedRectangle(r, m_pBrushLine, 5.0f);
        pRenderTarget->FillRoundedRectangle(r, m_pBrushBG);
        pRenderTarget->DrawText(_T("Hello, World!"), CRect(110, 100, 200, 150), m_pBlackBrush, m_pTextFormat);


      1) Правильный подход?
      2) Правильно так создавать CD2DBitmap с пустой строкой в имени файла?

      И увидел проблему (смотреть увеличенный фрагмент 400%):
      Вывод текста в OnDraw2D (правый) использует антиальясинг по текущему фону, независимо от того, в каком методе отрисовывался градиент (на картинке видны розовые окантовки от фона).
      А текст (левый), выводимый в OnUpdate, то он, как будто рисовался на белом фоне, и он одинаковый, независимо от того, в каком методе отрисовывался градиент. Визуально получается не красиво, без сглаживания, заметно на букве W.
      Прикреплённая картинка
      Прикреплённая картинка
        Хм... провел тесты.
        Вывод текста на прямую в OnDraw2D всегда с розовой окантовкой при любом фоне... :-?
        Хотя там, лично мне, уже выводить не нужно, но ситуация не понятна.
          Еще одни тесты провел: по таймеру рисовал разные изображения:
          Удаление m_pBRender и повторное его создание перед каждым выводом:
          ExpandedWrap disabled
            m_pBRender = new CBitmapRenderTarget();
            GetRenderTarget()->CreateCompatibleRenderTarget(*m_pBRender, CD2DSizeF(sizeTotal.cx, sizeTotal.cy));

          Не очищает изображение, а повторно там рисуется и при выводе многократно накладывается. Выход: заливка фоном перед началом рисования.

          Но теперь имею такую проблему: хотел подобным образом подготовить разные картинки в памяти с надписями, чтоб выводит их в нужным местах в конечном рендере. А по факту получается, что это все одна и та же область рисования?
          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
          0 пользователей:


          Рейтинг@Mail.ru
          [ Script execution time: 0,0399 ]   [ 18 queries used ]   [ Generated: 18.04.24, 03:56 GMT ]