powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / DirectX отрисовка интерфейса
7 сообщений из 7, страница 1 из 1
DirectX отрисовка интерфейса
    #34288904
cppdev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Возникла задача создать оконный интерфейс под Direct3D с контролами (buttons, radio buttons,checkbox, editbox,listview,combobox,sliders, scrollbars). В принципе это я реализовал. Вопрос в следующем. Отрисовка мелких элементов осуществляется с помощью геометрии (линия - прямоугольник из 2х треугольников с текстурой), что довольно накладно получается ИМХО. Может кто знает другой способ? Как это интересно реализовано в Vista, ведь там gdi это обертка над DirectX, т.е. каким образом они отрисовывают grid'ы и более сложные элементы, состоящие из множества мелких деталей.
...
Рейтинг: 0 / 0
DirectX отрисовка интерфейса
    #34291271
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
первое что приходит в голову, это получит DC от поверхности текстуры какой нибудь, в нее все нарисовать средствами GDI и затем уже натянуть эту текстуру на два треугольника, которые образуют окно с необходимыми объектами.

Второе что приходит в голову.
Нахрена же линию рисовать как треугольника? Неужели DirectX не позволяет нарисовать линию?
OpenGL точно умеет :)

третье что приходит в голову.
нарисовать каждый контрол на своей текстуре и затем натягивать эту текстуру на два треугольника, которые образуют контрол на экране.
...
Рейтинг: 0 / 0
DirectX отрисовка интерфейса
    #34291316
cppdev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
По поводу линий - DirectX действительно это не умеет 8) (D3DPT_LINELIST не считается)

По поводу DC. Многие говорят, что это зло, и приводит к снижению производительности. Сложно сказать, т.к. не проверял.

Я делаю следующим образом, каждый контрол состоит из нескольких полигонов (например кнопка из 2, окно из 10, scrollbar из 5) Текстура у них одна (только координаты розняться), в этой же текстуре шрифт. Отрисовка делается батчингом геометрии, т.е. ее я аккумулирую в буфере, а потом вызов DrawIndexPrimitive (в лучшем случае 1)
...
Рейтинг: 0 / 0
DirectX отрисовка интерфейса
    #34291411
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cppdevПо поводу линий - DirectX действительно это не умеет 8) (D3DPT_LINELIST не считается)

Это как это не умеет?
Ещё есть D3DPT_LINESTRIP.
Что-то не пойму, в чем проблема с линиями.
И потом, зачем линии? Если элементы управления не масштабируемы, то можно взять текстуру, и наложить её с альфатестом/альфаблендингом на экран, тексель в пиксель.
Лично я бы постарался все свести к текстурам. Только там нужен небольшой трюк - элемент, поскольку меняет размеры, должен рисоваться сеткой 3на3 квадрата.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
+-+-+-+
| 0 | 1 | 2 |
+-+-+-+
| 3 | 4 | 5 |
+-+-+-+
| 6 | 7 | 8 |
+-+-+-+
Т.е. при любом растяжении элемента управления квадраты 0, 2, 6, 7 размер не меняют, а растягиваются только 1,3-5,7. Т.е. боковые линии не будут размыливаться.
Этот вариант не пройдет, если нужно будет затайленый фон в элементе управления или на края.
Тогда надо будет делать текстуру обрезков, и накладывать с установкой D3DTADRESS_WRAP...

cppdev
По поводу DC. Многие говорят, что это зло, и приводит к снижению производительности. Сложно сказать, т.к. не проверял.

Снижает.
К слову. Майкрософт предлагает ряд классов под элементы управления и текст. Они входят в состав DXUI (dxsdk february update). Сам не пользуюсь (не нравятся), но может, это то что нужно. Они поддерживают IME/ввод на юникод языках, любой шрифт и т.д.

cppdevЯ делаю следующим образом, каждый контрол состоит из нескольких полигонов (например кнопка из 2, окно из 10, scrollbar из 5) Текстура у них одна (только координаты розняться), в этой же текстуре шрифт. Отрисовка делается батчингом геометрии, т.е. ее я аккумулирую в буфере, а потом вызов DrawIndexPrimitive (в лучшем случае 1)
Можно использовать Draw(Indexed)PrimitiveUP, если графические элементы часто движутся и/или их мало. GUI элементы в любом случае дадут падение производительности, как бы они не были реализованы...

alex_k
первое что приходит в голову, это получит DC от поверхности текстуры какой нибудь, в нее все нарисовать средствами GDI и затем уже натянуть эту текстуру на два треугольника, которые образуют окно с необходимыми объектами.
Вообще, как я помню, это не так то просто. IDirect3DBaseTexture9 напрямую таких методов не предлагает. Нужно будет брать определенный сурфейса с него брать DC, и работать это быстро не будет, плюс убьет все бонусы ускорения...
...
Рейтинг: 0 / 0
DirectX отрисовка интерфейса
    #34292186
cppdev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 ErV

DX интерфейс от Microsoft я видел, использовал его как источник, чтобы свой сделать, т.к. по большому счету он мне не очень понравился. Громоздко, но это ИМХО. По поводу тайлинга текстур и маштабируемости, то для окон делаю именно так, как вы посоветовали, т.е. матрица 3 на 3.
Еще раз повторяюсь все нормально работает, вроде как )))

Есть правда одна проблема - это с отсечением части элементов внутри контейнера (например окна). Не знаю на каком способе остановиться, т.е. сделать с помощью клиппинга в DX или самому изменять координаты меша контрола. Скорее сделаю как irrlicht.
...
Рейтинг: 0 / 0
DirectX отрисовка интерфейса
    #34304466
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 cppdev
если честно, я не понял комментарий насчет того, что "DirectX не умеет рисовать линии". По моим данным (я с DirectX довольно долго общаюсь), умеет, в том числе затекстуренные. (сам неоднократно их использовал). Другой вопрос в том, что при отрисовке примитивов через DrawPrimitiveUP, к примеру, на некоторых картах ATI со включенным PURE_DEVICE ускорением эти линии отображаться не будут. Нужно будет создавать устройство с флагами MIXED или SOFTWARE_VERTEX_PROCESSING.

Насчет отсчения элементов. Можно озвереть и сделать клипплейнами :).
Но достаточно несложно их отсекать вручную, особенно если это элементы такого же типа, как Win - т.е. прямоугольник, который не вращается...
...
Рейтинг: 0 / 0
DirectX отрисовка интерфейса
    #34311129
cppdev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 ErV

А можно поподробнее, если это не затруднит, по поводу линий и отсечения. Как бы вы сделали?
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / DirectX отрисовка интерфейса
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]