Jump to content

dxDraw: alpha каналы, маски и другие возможности


Recommended Posts

Я тут решил замутить что-то типа радара с помощью DX прорисовки. Если не вдаваться в детали, то все это возможно с помощью прямых рук, картинки с картой и картинок со своими значками.

Возник только 1 вопрос. Я захотел сделать, чтобы радар вращался как игровой. С этим тоже проблем нет, но вращается-то не кругляшок (как оригинал), а квадратная картинка. Вопрос как раз в том, как сделать так, чтобы ненужные края картинки обрезать.

Сразу мысль сверкнула об альфа каналах и прочих прелестях, допустим, картинок PNG и текстур DDS. Кто-нибудь такие махинации с вращающимися картинками и альфа каналами делал в МТА ваще?

Edited by Guest
Link to comment

Ты хочешь поверх текстуры карты наложить текстуру альфа канала (кружок) что бы обрезать? Я что-то не представляю такую картинку, что бы обрезать края с помощью альфы канала, и при этом не обрезать цетр (ведь там тоже альфа).

А вообще альфа канал не перекроет текстуру.

Link to comment

Поправьте меня, если вру, но скорее всего - никак. Квадрат квадратом останется, можно, конечно, края прикрыть какой-нибудь staticimage-маской в виде толстого бублика, весь вопрос в эстетике полученного результата.

Еще вариант - порезать карту на меньшие квадратики и рисовать составную кару. Чем меньше сторона квадрата, тем проще скрыть его угол, очевидно. Сталбыть, можно и маску потоньше взять.

Link to comment

Ну так вообще в графике всё квадратное и нет ничего круглого вообще (даже "круг" например колесо машины, сделано из большого кол-ва квадратиков, так называемыми "полигонами").

А вообще как-то же в NSF сделали радар которые поворачивается.. Как вариант можно обрезать через dxDrawImageSection.. т.е. показать очень много секций.

Link to comment

любая простая 2Д графика на экране состоит как минимум из квадратиков под названием - пиксел, но это так, шутка..

Вопрос скорее в эстетике, я канеш могу и квадратик вращать, обрамив его края тем, что под руку попадется. Но это же не то совсем.

Фактически вопрос упирается в некий функционал, который позволяет, поверх любой картинки наложить фильтр, который сделает невидимыми отдельные части этой картинки.

Link to comment

Есть смысл запросить в баг трекере функцию маскировки. Что-то типа dxDrawMask ( x, y, width, size, file, color ) - где в файле можно например нарисовать черный круг на прозрачном фоне, color - задать черный, и рендерить поверх текстуры, чтобы в итоге из этой текстуры была видна лишь та область что попадает под черный круг.

Link to comment

сэр, Вы читаете мои мысли (: только вот мотивированно объяснить необходимость этого в баг трекере сложнее, чем представить как оно должно работать

Логически подумать.. новые функции ваще-то не нужны, внешне достаточно нового параметра в dxDrawImageSection. Для dxDrawImage это не нужно, т.к. там можно юзать просто форматы картинок с альфа каналом.

bool dxDrawImageSection ( float posX, float posY, float width, float height, float u, float v, float usize, float vsize, string filepath [, string maskfilepath="", float rotation = 0, float rotationCenterOffsetX = 0, float rotationCenterOffsetY = 0, int color = white, bool postGUI = false ] ) 

Хотя сказать гораздо проще чем реально сделать. Есть ли ваще такая возможность в DirectX и сложно ли такой функционал организовать?

Нащщет dxDrawMask я думаю.. это еще сложнее, т.к. будет касаться и других DX фигурок, а не только картинок.

Link to comment
Есть ли ваще такая возможность в DirectX и сложно ли такой функционал организовать?

Да, это стандартный функционал в dx

оу, если так, то канеш лучше эти маски для всех DX фигурок. Кстати, интересует такой вопрос по теме, чат же это тоже DX и в нем текст огранён в коробочку. При прокрутке чата вверх/вниз

image_4d882d8ddfc40.jpg

текст обрезается и сверху, т.е. как я понял возможность задать маску или бокс для какой-то прорисовки есть (:

ЗЫ: переименовал тему

Ну и ваще в таком случае не только этот механизм нужен, а еще и несколько других. Таких, как например

  • возможность крутить текст, также как картинку на какой-то Z угол:
    bool dxDrawText ( ... [, float rotation=0, ... ] ) 
    


  • возможность показывать часть бокса с текстом, ограниченную указанными оффсетами как и картинку. Не знаю как сделан чат, но он явно ограничен в какой-то бокс:
    bool dxDrawText ( ... [, float u, float v, float usize, float vsize, ... ] ) 
    

Link to comment
  • 2 months later...

Итак, первоначальная задача (см. 1ый пост) была успешно решена с помощью новых DX функций, в частности с помощью простого пиксельного шейдера. Я не только смог сделать круглый радар, но также смог сделать его черно-белым (как в GTA IV), хотя исходная картинка с картой была разноцветная.

Огромное спасибо, ccw, за эти ОЧЕНЬ ПОЛЕЗНЫЕ ФУНКЦИИ (:

Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...