Суббота, 20 Апреля 2024, 09:19

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Форум игроделов » Создание игр и всё, что с этим связано » Игровая литература » Вики по DirectX 11
Вики по DirectX 11
warzesДата: Понедельник, 13 Августа 2012, 19:02 | Сообщение # 1
участник
Сейчас нет на сайте
Потихоньку решил писать статьи по изучению DirectX 11.

Вики

Пишите в этой теме критику, комментарии, замечания, ошибки, неточности, просьбу пояснить что-то и т.д.


Мой блог
Вики DirectX


Сообщение отредактировал warzes - Воскресенье, 30 Сентября 2012, 09:01
dima9595Дата: Вторник, 14 Августа 2012, 09:14 | Сообщение # 2
почти ветеран
Сейчас нет на сайте
Я в этом не смыслю,но уроки куль.
Хотелось бы что бы код выделялся более красиво,либо смени бейкграунд.Просто код не выделяется,а читается как простой текст


warzesДата: Пятница, 17 Августа 2012, 15:38 | Сообщение # 3
участник
Сейчас нет на сайте
ладно, подумаю что делать с выделением кода

Добавлено (15.08.2012, 16:36)
---------------------------------------------
В статьи закралась ужасная ошибка, блогер стер в коде все в чем увидел символ < или >. Завтра организую вики для статей

Добавлено (17.08.2012, 15:38)
---------------------------------------------
Решил организовать вики по изучению DX 11 (кстати, не обязательно именно по 11) - http://ru.directx.wikia.com/wiki/DirectX_вики
Цикл моих уроков будет теперь здесь - http://ru.directx.wikia.com/wiki/DirectX_11_шаг_за_шагом

Вики собрал на скорую руку - не удивлятесь шаблонным надписям там и тут:)

На данный момент вики свободная и любой (даже без регистрации) может вносить в нее правки


Мой блог
Вики DirectX
НохчиДата: Пятница, 17 Августа 2012, 15:58 | Сообщение # 4
заслуженный участник
Сейчас нет на сайте
Про DirextX пока ничего там нет.

Многие вопросы по Windows отпадут, если посмотреть тут
warzesДата: Понедельник, 20 Августа 2012, 08:06 | Сообщение # 5
участник
Сейчас нет на сайте
да сначала с этим нужно разобраться:)

Как закончу перенос статьи по фреймворку, так сразу же и начну писать про DX11

Добавлено (20.08.2012, 08:06)
---------------------------------------------
Добави урок по инициализацию DirectX - критикуйте:)


Мой блог
Вики DirectX
НохчиДата: Понедельник, 20 Августа 2012, 10:23 | Сообщение # 6
заслуженный участник
Сейчас нет на сайте
Признаюсь, пока прочитал статью только по диагонали, из того, что бросается в глаза: если лезть в такие подробности как immediate/deffered context, надо бы объяснгить что это означает и какая разница между ними; нужно написать про подбор оптимального feature level, если говорить о нормальной инициализации; ну и, если придираться, двойная буферизация - это наверное все-таки double buffering biggrin
Плюс еще всякие очепятки.


Многие вопросы по Windows отпадут, если посмотреть тут
warzesДата: Понедельник, 20 Августа 2012, 12:34 | Сообщение # 7
участник
Сейчас нет на сайте
Quote (Нохчи)
если лезть в такие подробности как immediate/deffered context

если честно, я сам не до конца понял подробности о deffered context
Quote (Нохчи)
нужно написать про подбор оптимального feature level

D3D11CreateDeviceAndSwapChain() же сам подбирает наиболее оптимальный. Я вообще думаю, что стоит это место убрать. А если расписывать что при каком будет работать - то это вообще долго, да и не особо нужно.

Quote (Нохчи)
если придираться, двойная буферизация - это наверное все-таки double buffering

В DX11 нет понятия - двойная буферизация, по той простой причине что буферов может быть несколько. По официальной документации это называется swap chain's buffers. Когда же нужно более определенно - front buffer и back buffer. То есть после перевода - передний буфер и задний буфер.
А вот в начале, где я написал "Данная технология называется backbuffer.". я ошибся и сейчас исправлю
Quote (Нохчи)
Плюс еще всякие очепятки.

буду благодарен за указание на них


Мой блог
Вики DirectX
UndeadДата: Понедельник, 20 Августа 2012, 13:04 | Сообщение # 8
NeoAxis User
Сейчас нет на сайте
warzes, Код неудобно читать, сделай подсветку синтаксиса.

Вcем зла.

Сообщение отредактировал Undead - Понедельник, 20 Августа 2012, 13:05
warzesДата: Понедельник, 20 Августа 2012, 13:11 | Сообщение # 9
участник
Сейчас нет на сайте
Quote (Undead)
Код неудобно читать, сделай подсветку синтаксиса.

тут надо проверять, как-то неудобно в вики сделана подсветка. Попробую пошаманить но не уверен что получится.


Мой блог
Вики DirectX
ArchidoДата: Понедельник, 20 Августа 2012, 13:25 | Сообщение # 10
Сэнсэй
Сейчас нет на сайте
Quote (warzes)
если честно, я сам не до конца понял подробности о deffered context

В случае Immediate Сontext вызовы API собираются в специальный командный буфер и по мере его заполнения (или в случае принудительной синхронизации), он сразу же отправляется на исполнение GPU. Собсна, формирование этого буфера лежит полностью на плечах CPU (это делает DX'вый Runtime) и на это тратится какое-то время, ессно. Заниматься такими делами может только один поток, иначе бы постоянная синхронизация между вызовами API убила бы всю производительность.

Deffered Context же, специально придумали, чтобы собирать такие буферы в нескольких потоках. Т.е. полноценный рендеринг (не отрисовка квадрата, а отрисовка мешей, теней, кучи эффектов, etc) всегда можно разделить на независимые подзадачи (те же тени можно "рисовать" отдельно, например) и каждую отдельную задачу размазать на несколько потоков.
Суть DC в том, что буфер, который собирается в процессе вызовов - не отправляется на исполнение GPU, а ждет когда мы его сами туда отправим. Таким образом эти буферы собираются параллельно на нескольких потоках и когда все готово, то эти буферы "воспроизводятся" в главном потоке (с помощью Immediate Сontext) последовательно (CPU тут уже почти ничего не делает, все отправляется на исполнение GPU).

Как-то так, вообщем. В SDK, кстати, об этом есть инфа.

P.S. Жду, когда будем рисовать первый текстурированный квадрат smile


C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)

Сообщение отредактировал Archido - Понедельник, 20 Августа 2012, 13:25
warzesДата: Воскресенье, 30 Сентября 2012, 09:00 | Сообщение # 11
участник
Сейчас нет на сайте
написан новый урок - вывод треугольника. Следующий урок будет про вывод трехмерного куба :D, а также про систему координат и матрицы
Следующий урок будет чуть позже - я так сказать решил отдохнуть и поработать над проектами

И на всякий случай - урок написан прямо вот сегодня. Поэтому в нем присутствуют орфографические ошибки, которые я буду постепенно исправлять

Добавлено (07.09.2012, 13:02)
---------------------------------------------
Написан новый урок -про мировое пространство. Пока пометил что он в доработке - надо дописать теорию

Далее будет урок про текстуры и загрузку модели из файла

Добавлено (08.09.2012, 15:48)
---------------------------------------------
Чето как-то тихо:)

Поэтому опишу будущее развитие - так как я пока с вики работаю в одиночку (люди, а ведь вы тоже можете писать статьи, даже регистрироваться не нужно, хотя желательно) то буду развивать только такие направления - вопервых основной цикл "DirectX шаг за шагом" в нем будет изучение работы с самим дирексом, все примеры - это абстрактные кубики и шарики. Еще один раздел - математика, там только теория будет. Третий раздел - HLSL, изучение синтаксиса шейдеров, на тех же абстрактных примерах (но не самих алгоритмов, только синтаксис). А вот четвертый, наверное самый вкусный - создание трехмерного мира. Он будет базироваться на трех предыдущих. Вот так выглядят первые 4 урока из него:
1 урок
Подготовка, игровая камера и перемещение по миру


2 урок
Геометрия ландшафта, ее загрузка из файла


3 урок
Освещение ландшафта


4 урок
Текстурирование ландшафта


Код этих уроков уже написан, осталось оформить в статью. Но это из будущего:) Потому что я пока не расммотрел нужные разделы - текстурирование и освещение в "DirectX шаг за шагом". Но думаю, к концу месяца эти уроки будут опубликованы.

Добавлено (14.09.2012, 13:11)
---------------------------------------------
Новая статья
Кроме того сильно переработана навигация вики http://ru.directx.wikia.com/wiki/DirectX_вики
Пока многие разделы пусты, я ведь считай в одиночку веду это дело. Если кто желает поделится своим опытом по DirectX - приветствую, вход свободный, создавайте свои разделы и пишите cool

Добавлено (14.09.2012, 16:39)
---------------------------------------------
И следом еще один урок - http://ru.directx.wikia.com/wiki/DirectX_11_шаг_за_шагом:Простое_освещение

Надеюсь что успею также написать урок про текстуры

Добавлено (15.09.2012, 11:22)
---------------------------------------------
Еще одно, про текстуры - http://ru.directx.wikia.com/wiki/DirectX_11_шаг_за_шагом:Текстуры

Добавлено (29.09.2012, 08:28)
---------------------------------------------
Новый урок - загрузка модели из файла
статья

Добавлено (30.09.2012, 09:00)
---------------------------------------------
Еще один урок 2D

Кроме собственно рисования изображений рассмотрено отключение и включение Z буфера, а также работа с динамическими вершинными буферами

Люди, тут вообще кому-то интересны эти уроки? Или одни только unity программисты здесь?


Мой блог
Вики DirectX


Сообщение отредактировал warzes - Суббота, 08 Сентября 2012, 15:51
ArchidoДата: Воскресенье, 30 Сентября 2012, 10:04 | Сообщение # 12
Сэнсэй
Сейчас нет на сайте
Quote (warzes)
Люди, тут вообще кому-то интересны эти уроки?

А если нет, то что тогда? Мое мнение:

11-тый нынче не актуален tongue , опытным такие статьи не интересны, а для новичков он слишком сложен. Да и новичкам лучше разбираться в азах программирования графики с помощью толковой литературы (тот же Френк Луна), где вся информация систематизирована и разложена по полочкам (разжевано от и до), а автор не является любителем. Насколько я понимаю, ты сам не особо то в этом разбираешься, запросто можешь где-нибудь сфейлить и ввести новичка в заблуждение.

Мм, наверное это (написание таких статей) полезно в первую очередь для тебя самого.


C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)

Сообщение отредактировал Archido - Воскресенье, 30 Сентября 2012, 10:16
warzesДата: Воскресенье, 30 Сентября 2012, 12:36 | Сообщение # 13
участник
Сейчас нет на сайте
Quote
А если нет, то что тогда?

Ничего, дальше писать буду, но просто интересно:)

Quote (Archido)
а для новичков он слишком сложен

не знаю, ИМХО OpenGL сложнее, хотя бы тем что в OGL надо помнить тыщу и один параметр (ну там текстура, параметры смешивания и т.д.) которые у тебя установлены. В DX такого нет вообще, можно свободно переключать что угодно зная что потом это не вылезет где-нибудь в другом месте от того что ты забыл это отключить. Синтаксис тоже простой, термины четко озвучены (в отличие опять же от OGL). И не надо доказывать что OGL лучше, я именно с него начинал поверив когда-то что он типа легче для новичков, только время зря потратил:) Хотя, может быть причины были и немного в другом - не знаю

Quote (Archido)
Насколько я понимаю, ты сам не особо то в этом разбираешься, запросто можешь где-нибудь сфейлить и ввести новичка в заблуждение

Ну да, это возможно

Quote (Archido)
Мм, наверное это (написание таких статей) полезно в первую очередь для тебя самого.

Ага, я и сам неплохо руку набил по DX во время их написания.


Мой блог
Вики DirectX
ArchidoДата: Воскресенье, 30 Сентября 2012, 14:12 | Сообщение # 14
Сэнсэй
Сейчас нет на сайте
Quote (warzes)
не знаю, ИМХО OpenGL сложнее, хотя бы тем что в OGL надо помнить тыщу и один параметр (ну там текстура, параметры смешивания и т.д.) которые у тебя установлены. В DX такого нет вообще, можно свободно переключать что угодно зная что потом это не вылезет где-нибудь в другом месте от того что ты забыл это отключить.

Не понял о чем ты. Вся разница между ними в том, что OpenGL процедурный и на каждый чих нужно дергать свою функцию, в DX же все разнесено по интерфейсам, каждый из которых свою задачу выполняет, что как бы удобнее и логичнее (мне тоже нравится). Параметры ставятся то одинаково:
Code

glDepthFunc( поставили параметры z-Buffer'a );
glAlphaFunc( поставили параметры альфатеста );
glEnable(gl_alpha_test); //включили альфатест

Device->SetRenderState( поставили параметры z-Buffer'a );
Device->SetRenderState( поставили параметры альфатеста );
Device->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE ); //включили альфатест

И тебе надо везде все помнить одинаково, что там у тебя установлено и если в Директе не выключишь, оно точно также вылезет.

Quote (warzes)
я именно с него начинал поверив когда-то что он типа легче для новичков, только время зря потратил

Для новичков OpenGL советуют, потому что там нет ООП (в первую очередь) и можно сходу сразу начинать рисовать (не обязательно создавать и биндить буферы, Vertex Declaration'ы и т.п. В 9-ом правда тоже можно без этого). В ООП сходу так не вьехать и оно в начале обучения для многих представляет трудность, а в 11-ом же кроме ООП и кучи разных параметров нужно еще и в шейдеры вкуривать, прежде чем что-то вменяемое нарисовать. Можно, ессно, все подряд копипастить, но знаний это особо не прибавит. Поэтому я и считаю, что 11-тый сложнее всего для новичка. Еще роль играет тот факт, что по нему пока литературы на русском нет нормальной.

Время зря врятле потратил, т.к. кое-какие знания в программировании графики должен был получить wink

P.S. Каждый всегда со своей колокольни советует smile


C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)

Сообщение отредактировал Archido - Воскресенье, 30 Сентября 2012, 14:16
warzesДата: Воскресенье, 30 Сентября 2012, 15:09 | Сообщение # 15
участник
Сейчас нет на сайте
Quote (Archido)
Не понял о чем ты

Я как раз о glEnable() с их тысячами параметров и не только z-буфер, альфа и т.д. А также о тысяче других вещей - толщине линии, наложении текстуры (если ее предварительно самостоятельно не выключить, она будет рисоваться везде, тогда как в DX только до команды Draw...()) матрицах (возможно в OGL3+ уже и не проблема с переносом матриц в шейдеры, но вот часто забудешь про какой-нибудь сдвиг или вращение и потом удивляешься тому что видишь на экране)

Quote
потому что там нет ООП

Где там в DX ООП?. Инкапсуляция, Наследование, Полиморфизм - этого нет. А от того что интерфейсы там в виде классов - это не ООП (и даже то что они наследуются от интерфейсов COM - ведь мы то этого не замечаем).

Кста, как раз и урок тут написал про состояния рендера
Урок


Мой блог
Вики DirectX
ArchidoДата: Воскресенье, 30 Сентября 2012, 15:45 | Сообщение # 16
Сэнсэй
Сейчас нет на сайте
Quote (warzes)
Я как раз о glEnable() с их тысячами параметров и не только z-буфер, альфа и т.д. А также о тысяче других вещей - толщине линии, наложении текстуры (если ее предварительно самостоятельно не выключить, она будет рисоваться везде, тогда как в DX только до команды Draw...()) матрицах (возможно в OGL3+ уже и не проблема с переносом матриц в шейдеры, но вот часто забудешь про какой-нибудь сдвиг или вращение и потом удивляешься тому что видишь на экране)

Больше похоже на то, что ты бездумно и от балды включал какой-то стейт, а потом удивлялся что что-то не так happy

Quote (warzes)
Где там в DX ООП?. Инкапсуляция, Наследование, Полиморфизм - этого нет. А от того что интерфейсы там в виде классов - это не ООП (и даже то что они наследуются от интерфейсов COM - ведь мы то этого не замечаем).

Все там есть. Банально - если ты не в курсе, то COM с помощью подсчета сылок умеет контролировать владение объектами (не сам, ессно, ему надо в этом помочь). И пользоватетель оперирует этими же объектами, он должен их создавать, правильно удалять и самое главное очень правильно хранить. Один и тот же объект может использоваться в разных местах и если одному из них сделать Release, то в другом месте будет обращение по невалидному указателю. Такой же указатель можно передать другому интерфейсу и словить фейл.

Вообще само по себе использование ООП API навязывает делать у себя так же. Т.к. пачка глобальных переменных-указателей - это просто высший пилотаж, можно столько дел наворить. А их надо банально прятать - вот тебе и начало ООП.


C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)

Сообщение отредактировал Archido - Воскресенье, 30 Сентября 2012, 15:51
warzesДата: Воскресенье, 30 Сентября 2012, 15:52 | Сообщение # 17
участник
Сейчас нет на сайте
Quote (Archido)
Банально - если ты не в курсе, то COM с помощью подсчета сылок умеет контролировать владение объектами

Это все скрыто от обычного пользователя. Все WinAPI построено на COM, но это не мешает мне его юзать например на ассемблере или Си.

Quote (Archido)
Один и тот же объект может использоваться в разных местах и если одному из них сделать Release, то в другом месте будет обращение по невалидному указателю

Это не ООП, точно также в процедурном Си можно в одном месте удалить кучу а в другом к ней обратиться. Просто тут нужно понимать что если ты что-то создал, это нужно потом будет удалить, и если ты это удалил то не нужно больше к этому обращаться, но только вместо new/delete - CreateX/Release.

А вообще к теме это не относится. А OGL я не люблю, да, но возможно причины могут, как я писал, быть даже банальней - не осилил biggrin


Мой блог
Вики DirectX
ArchidoДата: Воскресенье, 30 Сентября 2012, 16:02 | Сообщение # 18
Сэнсэй
Сейчас нет на сайте
Quote (warzes)
Это все скрыто от обычного пользователя

Ни разу, CОM предоставляет тебе рычаги, с помощью которых ты этим и управляешь. Мда.

Quote (warzes)
Все WinAPI построено на COM, но это не мешает мне его юзать например на ассемблере или Си.

Это не в кассу и WinApi не построено на COM.

Quote (warzes)
Это не ООП, точно также в процедурном Си можно в одном месте удалить кучу а в другом к ней обратиться. Просто тут нужно понимать что если ты что-то создал, это нужно потом будет удалить, и если ты это удалил то не нужно больше к этому обращаться, но только вместо new/delete - CreateX/Release.

Еще раз, у тебя объект - текстура, которая используется в куче других мест. Как определять момент, когда ее нужно удалить (и чтобы все остальные об этом узнали) и отследить момент передачи невалидного указателя в какой-нить SetTexture, иначе все упадет.


C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)

Сообщение отредактировал Archido - Воскресенье, 30 Сентября 2012, 16:03
warzesДата: Воскресенье, 30 Сентября 2012, 16:36 | Сообщение # 19
участник
Сейчас нет на сайте
Quote (Archido)
Еще раз, у тебя объект - текстура, которая используется в куче других мест. Как определять момент, когда ее нужно удалить (и чтобы все остальные об этом узнали) и отследить момент передачи невалидного указателя в какой-нить SetTexture, иначе все упадет.

есть куча выделенная malloc, она используется в куче других мест. Как определять момент, когда ее нужно удалить (и чтобы все остальные об этом узнали) и отследить момент передачи невалидного указателя в какую-нибудь функцию... Так Си тогда тоже ООП cool Я к тому что работа с памятью это уж точно не ООП, подсчет ссылок и сборщик мусора можно спокойно реализовать процедурно (например через статические переменные). От того что все интерфейсы DX унаследованы от IUnknown конечному пользователю ни холодно, ни жарко, для изучения об этом вообще можно не знать, а для серьезной работы понимание ООП уже придет

Quote (Archido)
Это не в кассу и WinApi не построено на COM.

Почему же не в кассу? Для того чтобы изучить GAPI, можно совершенно спокойно не знать как оно там внутри построено (точно также как и для изучения Unity можно спойкойно не думать о например том как там архитектурно работает менеджер ресурсов) Да, вон я до сих пор не понимаю как работают VA_arg что мне совершенно не мешает юзать printf() и писать свои реализации с переменным числом аргументов.
То есть чтобы изучать DX, надо знать только что такое классы, да и то не обязательно - спокойно можно писать процедурно. Потому что мы не наследуем сами ни один из интерфейсов DX

Добавлено (30.09.2012, 16:36)
---------------------------------------------
Вот сделал простенько подсчет ссылок на Си, процедурно:
Code
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

struct Foo
{
    int i;
};

static int FooNum = 0;
static Foo *FooParrent = 0;

Foo* Create()
{
    if (!FooNum)
     FooParrent = (Foo*)malloc(sizeof(Foo));

    FooNum++;
    printf("Foo num %d\n",FooNum);

    return FooParrent;
}

void Free()
{
    FooNum--;
    printf("Foo num %d\n",FooNum);
    if (!FooNum)
     free(FooParrent);
}

int main(int argc, char* argv[])
{
    Foo *foo = Create();
    Foo *foo2 = Create();

    Free();
    Free();

    system ("PAUSE");
    return 0;
}

Так причем здесь ООП? А ведь тоже самое, считаем количество ссылок. Если один объект был уничтожен, но кто-то еще это юзает, то не удаляем память
ООП, это как раз наследование, полиморфизм и инкапсуляция. А так как мы не должны ни от чего наследоваться, не должны ничео полиморфировать и ничего от нас в DX не скрыто - это значит что мы спокойно можем писать в любой другой парадигме (вот например в движке Ogre нельзя без ООП, потому что там надо наследоваться и есть инкапсуляция внутреней архитектуры_


Мой блог
Вики DirectX


Сообщение отредактировал warzes - Воскресенье, 30 Сентября 2012, 16:40
ArchidoДата: Воскресенье, 30 Сентября 2012, 17:31 | Сообщение # 20
Сэнсэй
Сейчас нет на сайте
Т.е. у тебя что указатель на кусок памяти, что указатель на объект (у которого можно дергать ф-ции и менять его состояние) - вся одна фигня. А если нет наследования, то нет и ООП.
Окей, считай как хочешь. Спорить не хочу.

Изначально речь была о том почему OpenGL считается легче для новичков, давай тогда по-другому скажу.
В DX'e тебе после создания ресурсов выдаются указатели на объекты, которые можно легко угробить. За ними надо следить - когда хранишь, копируешь в разные места... чтобы не вызвать метод по невалидному указателю или передать последний в метод другого объекта. Ну и как-то грамотно их нужно удалять, когда не нужны. Сложновато.
В OpenGL тебе на руки дают хендл, который можно в сотне разных мест хранить, передавать его в любую ф-цию, даже если его уже давно удалили. И все будет путем.

Да и не нужно знать, что такое динамическая память и классы, что есть у них какие-то методы и так далее. Все проще.


C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)

Сообщение отредактировал Archido - Воскресенье, 30 Сентября 2012, 17:34
Форум игроделов » Создание игр и всё, что с этим связано » Игровая литература » Вики по DirectX 11
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг