|
|
|
DirectX отрисовка интерфейса
|
|||
|---|---|---|---|
|
#18+
Возникла задача создать оконный интерфейс под Direct3D с контролами (buttons, radio buttons,checkbox, editbox,listview,combobox,sliders, scrollbars). В принципе это я реализовал. Вопрос в следующем. Отрисовка мелких элементов осуществляется с помощью геометрии (линия - прямоугольник из 2х треугольников с текстурой), что довольно накладно получается ИМХО. Может кто знает другой способ? Как это интересно реализовано в Vista, ведь там gdi это обертка над DirectX, т.е. каким образом они отрисовывают grid'ы и более сложные элементы, состоящие из множества мелких деталей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2007, 10:56 |
|
||
|
DirectX отрисовка интерфейса
|
|||
|---|---|---|---|
|
#18+
первое что приходит в голову, это получит DC от поверхности текстуры какой нибудь, в нее все нарисовать средствами GDI и затем уже натянуть эту текстуру на два треугольника, которые образуют окно с необходимыми объектами. Второе что приходит в голову. Нахрена же линию рисовать как треугольника? Неужели DirectX не позволяет нарисовать линию? OpenGL точно умеет :) третье что приходит в голову. нарисовать каждый контрол на своей текстуре и затем натягивать эту текстуру на два треугольника, которые образуют контрол на экране. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2007, 22:55 |
|
||
|
DirectX отрисовка интерфейса
|
|||
|---|---|---|---|
|
#18+
По поводу линий - DirectX действительно это не умеет 8) (D3DPT_LINELIST не считается) По поводу DC. Многие говорят, что это зло, и приводит к снижению производительности. Сложно сказать, т.к. не проверял. Я делаю следующим образом, каждый контрол состоит из нескольких полигонов (например кнопка из 2, окно из 10, scrollbar из 5) Текстура у них одна (только координаты розняться), в этой же текстуре шрифт. Отрисовка делается батчингом геометрии, т.е. ее я аккумулирую в буфере, а потом вызов DrawIndexPrimitive (в лучшем случае 1) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2007, 23:43 |
|
||
|
DirectX отрисовка интерфейса
|
|||
|---|---|---|---|
|
#18+
cppdevПо поводу линий - DirectX действительно это не умеет 8) (D3DPT_LINELIST не считается) Это как это не умеет? Ещё есть D3DPT_LINESTRIP. Что-то не пойму, в чем проблема с линиями. И потом, зачем линии? Если элементы управления не масштабируемы, то можно взять текстуру, и наложить её с альфатестом/альфаблендингом на экран, тексель в пиксель. Лично я бы постарался все свести к текстурам. Только там нужен небольшой трюк - элемент, поскольку меняет размеры, должен рисоваться сеткой 3на3 квадрата. Код: plaintext 1. 2. 3. 4. 5. 6. 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, и работать это быстро не будет, плюс убьет все бонусы ускорения... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2007, 03:46 |
|
||
|
DirectX отрисовка интерфейса
|
|||
|---|---|---|---|
|
#18+
2 ErV DX интерфейс от Microsoft я видел, использовал его как источник, чтобы свой сделать, т.к. по большому счету он мне не очень понравился. Громоздко, но это ИМХО. По поводу тайлинга текстур и маштабируемости, то для окон делаю именно так, как вы посоветовали, т.е. матрица 3 на 3. Еще раз повторяюсь все нормально работает, вроде как ))) Есть правда одна проблема - это с отсечением части элементов внутри контейнера (например окна). Не знаю на каком способе остановиться, т.е. сделать с помощью клиппинга в DX или самому изменять координаты меша контрола. Скорее сделаю как irrlicht. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2007, 12:06 |
|
||
|
DirectX отрисовка интерфейса
|
|||
|---|---|---|---|
|
#18+
2 cppdev если честно, я не понял комментарий насчет того, что "DirectX не умеет рисовать линии". По моим данным (я с DirectX довольно долго общаюсь), умеет, в том числе затекстуренные. (сам неоднократно их использовал). Другой вопрос в том, что при отрисовке примитивов через DrawPrimitiveUP, к примеру, на некоторых картах ATI со включенным PURE_DEVICE ускорением эти линии отображаться не будут. Нужно будет создавать устройство с флагами MIXED или SOFTWARE_VERTEX_PROCESSING. Насчет отсчения элементов. Можно озвереть и сделать клипплейнами :). Но достаточно несложно их отсекать вручную, особенно если это элементы такого же типа, как Win - т.е. прямоугольник, который не вращается... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.02.2007, 01:02 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=34311129&tid=2029489]: |
0ms |
get settings: |
7ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
180ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
61ms |
get tp. blocked users: |
1ms |
| others: | 245ms |
| total: | 527ms |

| 0 / 0 |
