четверг, 24 февраля 2011 г.

суббота, 19 февраля 2011 г.

Стиляги

Сшил наконец-то себе пальто, о котором я писал раньше. Ох и пришлось же мне с ним повозиться. Но носить Совпаршив с Петровки - с меня довольно.

"Как сказал буржуазный писатель Антон Палыч Чехов, надо по капле выдавливать из себя жлоба." (C) Фрэд.

Да, задроты, чтобы носить такое пальто, нужно иметь крепкие орешки :)

среда, 16 февраля 2011 г.

My own Fraps counter

От нечего делать прикрутил пока счётчик FPS к DirectGL.

Дело в том, что на Mac нет встроенных средств подсчёта кадров в секунду, и программ наподобии Fraps я тоже не видел. Поэтому было решено написать встроенный счётчик, общий для Win и Mac, а за образец была взята утилита Fraps.


Я отсканировал цифры Fraps-а принт-скрином и выстроил их в текстуре 160x26. Потом я написал утилиту, которая считывала данные из этого bmp-файла и записывала их в виде массива dword-ов для C++. Этот массив зашивается в exe-файл при билде, его легко копировать в текстуру и не нужно таскать с проектом .bmp файл. Далее я написал простой класс, который ведёт подсчёт кадров и расчёт fps, а также выводит несколько текстурированных квадов с текстурой шрифта. Т. к. stretch бэк-буфера DX9 не влияет на счётчик Fraps, мой вариант рисуется после того, как на окно натянута текстура с изображением кадра, но до вызова SwapBuffers().

Получился счётчик, который как две капли воды похож на Fraps.

пятница, 11 февраля 2011 г.

Нокия

Враг моего врага - мой друг.

среда, 9 февраля 2011 г.

MD2 Converter

Перенёс наконец-то код загрузки MD2 на Direct3D 11.


Т. к. формат очень старый и в своём первоначальном виде плохо подходит для Direct3D 11, было решено написать конвертер, который брал бы исходные данные и перерабатывал их таким образом, чтобы можно было легко загружать их и оперировать ими на GPU. Для простоты формат я назвал U(nified)MD2.

Во-первых, вершины всех фреймов в формате ubyte собраны вместе и заливаются в один буфер вершин. Для расчёта промежуточного кадра буфер вершин подключается к input slot 0 и 1, для первого слота указывается смещение для текущего кадра, а для второго - смещение для следующего за текущим кадра. Позиция вершины рассчитывается в вершинном шейдере простой интерполяцией двух атрибутов.

Для геометрии модели считается adjacency и записывается вместо стандартных индексов треугольников. Такой единый индексный буфер можно использовать как для поиска силуэтов, так и для стандартного рисования модели (железо игнорирует смежные индексы, если геометрический шейдер не установлен или не нуждается в них).

Данные об анимациях и их длинах также были переработаны для более удобного чтения (нет необходимости в парсинге).

Сложнее всего было решить, как поступить с текстурными координатами. Из-за швов (seams) в MD2 моделях существуют вершины, которые имеют одинаковую позицию, но разные текстурные координаты, и использовать один индексный буфер в таком случае невозможно. Графические ускорители никогда не поддерживали несколько индексных буферов (по очевидным причинам - сложность pre- и post-TnL кэшей увеличивается), поэтому простых решений два: индексировать на CPU или размножать вершины с разными текстурными координатами. Т. к. модели в Quake II геометрически очень просты, формировать буфер на CPU легко, но это не интересно. Размножение вершин возможно и обычно так и поступают в стандартных моделях, но в данном случае используется key frame анимация с множеством копий одних и тех же вершин, и дублирование станет многократным - решение получается некрасивым.

Наиболее правильный подход в данном случае - размножить uv координаты так, чтобы на каждый треугольник приходилось по три uv координаты (т. к. текстурные координаты общие для всех кадров, их увеличение несущественно). Теперь в геометрическом шейдере можно использовать семантику SV_PrimitiveID для индексации буфера текстурных координат, который подключается как shader resource:

Buffer g_buffer : register(t0);
uint pid: SV_PrimitiveID;
...
float2 tex = g_buffer.Load(pid * 3 + i);

где i - номер вершины треугольника.

Внедрение простого геометрического шейдера в современных GPU не приводит к существенному падению производительности, поэтому можно смело использовать такой подход. Впрочем, в случае с MD2 это скорее просто спортивный приём :)

И последнее: в MD2 текстурные координаты хранятся в формате ushort (значения делятся на высоту и ширину скина, получается float), но конвертер преобразует их в half.

суббота, 5 февраля 2011 г.

iPod

Купил Apple iPod 4 Gen на 8 Гб.

Нужно сказать, что гаджет замечательный - легкий, плоский, изящный. Retina Display выше всяких похвал: текст и контролы кристально четкие, растра не видно.

Сначала не мог разобраться с iTunes на MacOS X, но затем с легкостью закачал свою любимую музыку, iBook и несколько PDF, посмотрел демонстрационные версии Angry Birds и Cut the Rope, еще пару программ.

А купил я под для изучения английского. Его задача - бухтеть мне на ухо английскую речь в течении дня, и так, думаю, где-то полгода. Параллельно планирую заниматься грамматикой и пополнять словарный запас, и думаю, что мой английский сдвинется с мертвой точки.

Для iPod доступны бесплатные подкасты для изучающих английский, а также спец. программы (увы, платные, но посмотрим). Если кто надумает увлекаться английским, на ESL Podcast можно найти множество подкастов для этого занятия: интересно, что iPod отображает текст, если он записан вместе со звуком, так что можно слушать и одновременно читать диктуемый текст, если какое-то слово было не понято.

среда, 2 февраля 2011 г.

О скрипках

Пятнадцать лет... Пятнадцать лет я строил свои скрипки, искал новые конструкции, мучился... мучился с непослушными лаками. Мои инструменты стали красоты неслыханной! Я поселил в них сказочный мир звуков. Я всё это хотел подарить людям, но Вы, как в турецкий плен, уводили все мои детища. Я больше никогда, никогда не слышал их голоса... Боже, за что же такое наказание?

Елизавета

Весёлая царица была Елисавет: Поёт и веселится, порядка только нет.