понедельник, 30 мая 2011 г.

Yet again.

И в итоге круг замкнулся - необходимость в собственном классе моделей отпадает, убершейдерам моего производства находится замена. Следующая итерация будет вокруг разделения эффектов на постоянные параметры, задающиеся при сборке, и на переменные параметры. Это по идее должно сильно упростить сортировку рисуемых объектов на экране и избавится от того ужаса который я сделал.

Самый вопрос в том как к этой красоте прикрутить автоматические тесты.

четверг, 19 мая 2011 г.

Система материалов

Разрабатываю систему материалов для своего убердвижка на XNA. Будут убершейдеры и две модели света.

Сборщик убершейдеров умеет бинарные пины. В .fx-файле, в комментариях, описываются возможные пины и соответствующие им дефайны. Каждому пину соответсвует битовая маска. Препроцессор умеет их вытаскивать, перебирать и складывать скомпилированные эффекты в файл. В рантайме эффект возвращается по битовой маске.

Первая модель света предназначена для основного действия. Всегда есть 3 направленных источника света, соответствует стандартной модели освещения используемого в фотографировании.

Вторая модель света используется для фона. Один направленный источник есть всегда. Один точечный источник служит для света от взрывов и эффектов на переднем плане.

Будет до 5 текстур для каждого материала. Диффузная, нормаль, спекуляр, излучение и детализация. Каждая текстура может быть анимирована по UV, это должно дать возможность делать разные крутые эффекты. Свет намерен считать по Кук-Торренсу.

Главной проблемой может быть невозможность впихнуть всё в один проход пиксельного шейдера, я пока не специалист в этой области. Второй проблемой - комбинаторика, шейдеров может быть очень много. К примеру точно придётся считать все текстуры анимированными с нулевой скоростью по умолчанию. Так же вопрос про необходимость наличия нескольких UV-координат на мешах.

среда, 18 мая 2011 г.

Глубже.

Рабираюсь с XNA, оно заебись что такое. Первый взгляд на котором типично останавливаются и возвращаются клепать "уберэнжин" на OGL/DX/что-там-ещё ошибочен. Базовые возможности действительно пригодны в основном для демок и реально быстрой разработки, когда важно чтобы оно вообще заработало. Нужно идти глубже.

Самая писечка на текущий момент мне видится в связке Content Pipeline - игра. Первым сделал генератор спрайтовых атласов, спрайты переменого размера, скалдываются в кучу текстур, всё сохранятеся в один файл. Для доступа на atlas["имя спрайта"] получаем номер текстуру и область на текстуре для спрайта. Между отдельными элементами - 1 пиксель свободен, всё как положено.

Второе - генератор убершейдеров, пока с бинарными пинами. Генерирурет все возможные комбинации, складывает в файл, доступ по принципу Effect effect = ubershader[pin]. Хотел сделать крутую систему материалов, пока забил, нет надобности. Система построена на добавлении в текст шейдера описания возможных пинов. Далее можно добавить не-бинарные пины и указания несочетаменмых комбинаций.

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

Желания возвращаться на всякие там плючы нет уже вообще. Надо идти глубже.