Войти
ПрограммированиеФорумГрафика

Dynamic vertex pulling в Direct3D11 (комментарии) (2 стр)

Страницы: 1 2 3 Следующая »
#15
13:51, 22 янв. 2015

bazhenovc
> Да и шипать проект на OpenGL я бы не рискнул, по крайней мере в ближайшие года 3.
А почему не рискнул бы?

> На самом деле там не всё так радужно из-за постоянного рандомного доступа к памяти.
Ты сейчас о чем? Позиция/нормаль/ит.п. должны лежать рядом в текстуре. А если между вертексами, так со Structured буфер ровно то же самое, рандомный доступ.

> Помимо этого D3D11 не умеет MultiDrawIndirect
Да ну, правда?


#16
13:53, 22 янв. 2015

ronniko
>Какой смысл в этом будет, когда выйдет Mantle API SDK и Directx 12 ?
>К весне-лету по слухам будет Mantle API SDK, а Directx 12 будет в конце 2015.
Mantle SDK работает только на AMD, а DX12 - только на Windows 10.
А что делать людям, которые сидят на nvidia + windows 7-8? А это, между прочим, крупнейший сегмент
рынка на данный момент (и, возможно, еще на много много лет). Да и перспективы Win10 весьма туманны, если микры опять нафакапят
с чем-нить, то никто не будет на неё переходить и dx12 вообще останется за бортом.

Как видишь, это не панацея.

> Мало того что Mantle API и Directx 12 прекрасно побеждают разгрузку CPU, так еще имеют новые техники рендера и большую гибкость.
Да ты кэп. Спасибо хоть картинки больше не пихаешь в каждое свое сообщение.

#17
14:02, 22 янв. 2015

Mephisto std

А что делать людям, которые сидят на nvidia + windows 7-8?

Если так задавать вопрос.
То я точно так же могу задать такой же вопрос тебе  Mephisto std.
А что делать людям которые сидят на Directx 9 ? И которые юзают даже Windows XP.
Там Directx 10 и 11 нет.
#18
14:15, 22 янв. 2015

MrShoor
> Да ну, правда?
Ты не видишь разницы между DrawIndirect и MultiDrawIndirect?

Просто DrawIndirect:

const DrawArraysIndirectCommand  *cmd  = (const DrawArraysIndirectCommand  *)indirect;
DrawInstanced(mode,  cmd->first,  cmd->count,  cmd->instanceCount, cmd->baseInstance);

MultiDrawIndirect:

for (int n = 0; n < drawcount; n++) {
    const DrawArraysIndirectCommand  *cmd;
    if (stride != 0) {
        cmd = (const DrawArraysIndirectCommand  *)((uintptr)indirect + n * stride);
    } else {
        cmd = (const DrawArraysIndirectCommand  *)indirect + n;
    }
 
    DrawInstanced(mode,  cmd->first,  cmd->count,  cmd->instanceCount, cmd->baseInstance);
}

Мусорные вершины можно убрать только использовав MultiDrawIndirect, которого в D3D11 нет, есть только обычный DrawIndirect.

Для справки:
https://www.opengl.org/wiki/GLAPI/glDrawArraysIndirect
https://www.opengl.org/wiki/GLAPI/glMultiDrawArraysIndirect

#19
14:43, 22 янв. 2015

Mephisto std
> А что делать людям, которые сидят на nvidia + windows 7-8?
Портировать им мобильную версию консольной игры с ведроида, они всё равно неудачники. Плюс для них будет бесплатный переход на Win10, потому причин не делать этого просто нет.

#20
14:47, 22 янв. 2015

bazhenovc
> Мусорные вершины можно убрать только использовав MultiDrawIndirect, которого в
> D3D11 нет, есть только обычный DrawIndirect.
Бред же. DrawIndirect принимает на вход буфер, а не одну команду (сmd->first,  cmd->count,  cmd->instanceCount, cmd->baseInstance). Все прекрасно ложится на DrawIndirect, а этот мульти-пульти тут никаким боком. Подозреваю что MultiDrawIndirect еще и client-side, как его другие мульти (без индиректа которые) друзья.

#21
14:55, 22 янв. 2015

bazhenovc
> > Да ну, правда?
> Ты не видишь разницы между DrawIndirect и MultiDrawIndirect?

Поймали с поличным за руку ...

#22
14:56, 22 янв. 2015

MrShoor
Нарисуй мне десяток разных мешей с разным количеством полигонов с помощью одного вызова DrawIndirect.

#23
15:01, 22 янв. 2015

bazhenovc
> Да и шипать проект на OpenGL я бы не рискнул, по крайней мере в ближайшие года
> 3

Mac\Linux ?

#24
15:08, 22 янв. 2015

innuendo
> Mac\Linux ?
Не целевая аудитория.

#25
15:15, 22 янв. 2015
Поймали с поличным за руку ...

Наверное все дело в малиновых штанах :)
#26
15:18, 22 янв. 2015

bazhenovc
> > Mac\Linux ?
> Не целевая аудитория.

Ну я про порт же :)

#27
15:36, 22 янв. 2015

innuendo
> Ну я про порт же :)
Как-нибудь в другое время:)

#28
16:04, 22 янв. 2015

bazhenovc
> Нарисуй мне десяток разных мешей с разным количеством полигонов с помощью одного вызова DrawIndirect.
О боже. Ну ок. Складываешь все меши в один вертекс и индекс буфер. Запоминаешь с какого и до какого индекса находится каждый меш. Каждый объект имеет свои уникальные атрибуты, складываешь их в инстанс буфер. Запоминаешь индекс вершины, где хранятся атрибуты каждого объекта.
Перед отрисовкой создаешь Indirect буфер, заполняешь его структурами:
cmd->first,  cmd->count,  cmd->instanceCount, cmd->baseInstance
для каждого объекта.
Передаешь этот буфер в DrawIndirect, и вуаля, нарисованы разные объекты с разными лодами в разных местах. Единственное ограничение - либо вся геометрия должна быть индексирована, либо нет, а так же можно выводить только один тип примитива (нельзя смешивать треугольники и линии например).

#29
16:14, 22 янв. 2015
Передаешь этот буфер в DrawIndirect, и вуаля, нарисованы разные объекты с разными лодами в разных местах.

1 объект с одним лодом в одном месте. (ну можно в разных местах если instanceCount больше 1)
чтобы нарисовать разные объекты в разнах местах нужно вызвать DrawIndirect несколько раз.
чтобы нарисовать все объекты за один вызов - есть multi версия.
Страницы: 1 2 3 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.