понедельник, 22 февраля 2010 г.

ATI, OpenGL and OIT

Если поискать по гуглу, то можно найти, что ATI решило создать экспериментальную версию расширения GL_AMDX_abuffer_oit для лёгкой реализации OIT. Забавно.

четверг, 11 февраля 2010 г.

New Job

Меня взяли на испытательный срок в Ubisoft Ukraine.


Буду заниматься тем, что всегда хотел делать - программировать графику. Наконец-то :)

FPFL Demo

Дописал алгоритм фильтрации линий, feature level - D3D 10.
Ссылка: fpfl_dx11.zip
Скриншоты:


Prefiltered lines позволяют снизить эффект переменной толщины на линиях. Особенно это заметно в динамике.


Возможность рисовать линии с r < 1 позволяет улучшить восприятие решётки при больших углах обзора, снижается муар-эффект.


Можно рисовать "жирные" линии (здесь r = 2.5).

Над фильтрацией все ещё надо работать. Я взял готовые текстуры фильтров, но хотелось бы подготовить свои. Также очень важно подготовить фильтры с различным радиусом и точном соответствии в размерах фильтра при его расчёте и при рендеринге в window space.

воскресенье, 7 февраля 2010 г.

Демократия Древней Греции

А знаете ли вы, что демократия - родом из Древней Греции? И что сам термин происходит от древнегреческих слов "демос" - народ, и "кратос" - власть. По-простому - народовластие. Эта система стала прообразом политического устройства современности. Забавно, но если углубиться в историю, то можно обнаружить, что такие термины, как "аристократия" и "олигархия" тоже появились впервые в Древней Греции. Как, впрочем, и термин "тиран".

Так уж вышло, что государственность в Древней Греции сложилась в форме самостоятельных и независимых полисов - отдельных городов-государств. Полисы постоянно враждовали между собой, отстаивая свою полную независимость, и только изредка объединялись в хлипкие союзы, если предстояло воевать против общего врага. Особенность полисного мировоззрения привела к появлению понятия "гражданин". По-гречески, гражданин - это личность, наделенная некоторыми неотъемлемыми правами, составляющими основу его жизнедеятельности. Для сравнения, в древневосточных деспотиях такого понятия не существовало вовсе.

Одним из полисов были Афины, колыбель демократии.

Афинская демократия считается самой развитой, самой законченной и самой совершенной формой демократического строя античных государств. Золотым веком афинской демократии стало столетие с середины V до середины IV в. до н. э. (после окончания греко-персидских воин). Демократия в Афинах была направляемой и управляемой. Лидером афинской демократии с 444 г. до н.э. и на протяжении 15 лет был первый стратег Перикл.

Участвовать в управлении городом-государством могли лишь полноправные граждане. Гражданином становился мужчина - житель города, достигший 30 лет. Мужчины - жители других городов, женщины и рабы из числа голосующих исключались. В Афинах любой гражданин (независимо от его имущественного положения) мог выступить в народном собрании с критикой должностных лиц, имел право внести на обсуждение проект закона, мог вносить предложения по вопросам внутренней и внешней политики.

Главным и решающим органом власти в Афинах было Народное собрание. На Народное собрание собирались все граждане независимо от их имущественного положения, проживавшие в городе Афинах, Пирее и в Аттике. Народное собрание обладало широкими полномочиями. Здесь принимались государственные законы, утверждалось объявление войны и заключение мира, результаты переговоров с другими государствами, ратифицировались договоры и т. д.

В компетенцию Народного собрания входило проведение такого чрезвычайного мероприятия по охране государственного строя от происков знатных лиц, как остракизм. Остракизм - это голосование на черепках (остраках). Чтобы защитить порядок и власть от возможного захвата, граждане должны были решить вопрос, угрожает ли обвиняемый полисному строю. Заседающие в Народном собрании писали имя такого человека на черепках амфор и других сосудов: если на 6 тыс. черепков оказывалось одно и то же имя, обвиняемого изгоняли из Афин на 10 лет.

(Остраки с именами Фемистокла и Кимона).

воскресенье, 31 января 2010 г.

Fast Prefiltered Lines

Наткнулся на эту технику в GPU Gems 2. Суть её в том, что она позволяет рисовать линии с лучшим сглаживанием, чем это позволяет стандартный антиализинг.

Chapter 22. Fast Prefiltered Lines
Fast Antialiasing Using Prefiltered Lines on Graphics Hardware

В основе лежит уравнение расстояния от точки до отрезка (луча). Растеризатор генерирует фрагмент "широкой" линии, рассчитывается расстояние фрагмента до бесконечно тонкого отрезка, затем делается выборка из предрассчитанной текстуры. Что побудило меня остановиться и реализовать этот алгоритм:

1) В оригинальном варианте вершины линии-квада и уравнения для его рёбер предлагается рассчитывать на CPU. Сегодня их можно перенести в geometry shader.
2) В Direct3D 10/11 нет прямой возможности рисовать сглаженные линии произвольной толщины. Единственное, что доступно - это флажок AntialiasedLineEnable структуры D3D1x_RASTERIZER_DESC.

Я думал по-быстрому реализовать алгоритм и двинуться дальше, но не тут-то было. Дело в том, что в GPU Gems не объясняется, почему уравнения рёбер рассчитываются именно таким образом. Например, неясно, откуда выводится 1 + ..., почему в числителе двойка, а в выражении под корнем, которое, как нетрудно догадаться, вычисляет длину линии, стоит минус вместо плюса. Особенно странно выглядит единица, которой нет в уравнениях, приведённых на странице MIT (вторая ссылка).

Я решил более детально разобраться в этих вещах, а пока реализовал простейший вариант, где рассчитывается расстояние до идеальной линии и используется его обратное значение в виде альфы фрагмента. Линии подаются на вход как LINELIST, копируются вершинным шейдером в геометрический, там линия "раздувается" в стрип из двух треугольников, рассчитывается уравнение прямой (в window space) и всё это передаётся в фрагментный шейдер. Ну а там уже рассчитывается расстояние до сгенерированного фрагмента. Смысл выборки из текстуры в том, что расстояние (и альфа) изменяются линейно, а с выборкой можно заставить их лечь на некую плавную кривую, сделать границы резче или размытее. Подготовка различных фильтров - это отдельная тема.

Скриншоты:


Верхний треугольник: антиалиазинг средствами Direct3D (AntialiasedLineEnable = true + blending).
Первый ряд: линии с шириной 1.3, 1.6, 2.0.
Второй ряд: линии с шириной 4.0, 6.0, 10.0.

Вариант с радиусом 1.0 практически неотличим от того, что рисует Direct3D, т. е. механизмы рисования схожие. Единственное, что нужно дополнительно реализовать - это аккуратные "колпачки" на кончиках линий, при которых они могли бы более-менее плавно перетекать одна в другую.

понедельник, 25 января 2010 г.

English

Подумываю, не начать ли мне писать "технические" посты на английском? Надо совершенствоваться, да и блог будет более популярным...

пятница, 22 января 2010 г.

Calikusu

Когда-то в детстве я смотрел прекрасный 7-ми серийный турецкий фильм "Королёк - птичка певчая". Так вот, это он и есть - Calikusu (читается как Чалыкушу), снятый в 1980 году. Почему-то вспомнил я о нём, и решил найти, где в Сети его можно пересмотреть. Например, здесь:


Для души :)

"...Возьми чурек, а варенье называется "Гюльбешекер".
Кямран механически откусил от чурека.
- Нравится?
- Нравится.
- Будешь его любить?
- Уже люблю.
- Ну-ка, скажи ещё разок!
- Я люблю, очень люблю.
- Скажи, Кямран: "Я люблю Гюльбешекер".
- Я очень люблю Гюльбешекер.
- Я очень, очень, очень люблю Гюльбешекер!
- Я очень, очень, очень люблю Гюльбешекер! Ты и представить не можешь, как я люблю Гюльбешекер.