Наткнулся на эту технику в 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, т. е. механизмы рисования схожие. Единственное, что нужно дополнительно реализовать - это аккуратные "колпачки" на кончиках линий, при которых они могли бы более-менее плавно перетекать одна в другую.
воскресенье, 31 января 2010 г.
понедельник, 25 января 2010 г.
English
Подумываю, не начать ли мне писать "технические" посты на английском? Надо совершенствоваться, да и блог будет более популярным...
пятница, 22 января 2010 г.
Calikusu
Когда-то в детстве я смотрел прекрасный 7-ми серийный турецкий фильм "Королёк - птичка певчая". Так вот, это он и есть - Calikusu (читается как Чалыкушу), снятый в 1980 году. Почему-то вспомнил я о нём, и решил найти, где в Сети его можно пересмотреть. Например, здесь:
"...Возьми чурек, а варенье называется "Гюльбешекер".
Кямран механически откусил от чурека.
- Нравится?
- Нравится.
- Будешь его любить?
- Уже люблю.
- Ну-ка, скажи ещё разок!
- Я люблю, очень люблю.
- Скажи, Кямран: "Я люблю Гюльбешекер".
- Я очень люблю Гюльбешекер.
- Я очень, очень, очень люблю Гюльбешекер!
- Я очень, очень, очень люблю Гюльбешекер! Ты и представить не можешь, как я люблю Гюльбешекер.
Для души :)
"...Возьми чурек, а варенье называется "Гюльбешекер".
Кямран механически откусил от чурека.
- Нравится?
- Нравится.
- Будешь его любить?
- Уже люблю.
- Ну-ка, скажи ещё разок!
- Я люблю, очень люблю.
- Скажи, Кямран: "Я люблю Гюльбешекер".
- Я очень люблю Гюльбешекер.
- Я очень, очень, очень люблю Гюльбешекер!
- Я очень, очень, очень люблю Гюльбешекер! Ты и представить не можешь, как я люблю Гюльбешекер.
GPU memory test
Дописал демку с блендингом плоскостей, которая использует различные методы: блендинг через ROP и используя atomic операции над различными UAV. Про результаты я уже писал, поэтому привожу только ссылку:
Интересно, конечно, было бы потестировать это на GF100. Если у кого-то руки дойдут до этого, дайте знать! Также, если хочется посмотреть на артефакты read/write contention, откройте файл "MEDIA/shaders/source/incr.psh" и закомментируйте строчку USE_ATOMICS.
Интересно, конечно, было бы потестировать это на GF100. Если у кого-то руки дойдут до этого, дайте знать! Также, если хочется посмотреть на артефакты read/write contention, откройте файл "MEDIA/shaders/source/incr.psh" и закомментируйте строчку USE_ATOMICS.
вторник, 19 января 2010 г.
Buzz and Woody Add a Dimension
21 у нас начинается показ Toy Story 2 в 3D. Надо обязательно сходить.
А этим летом, если кто ещё не знает, выйдёт третья (и скорее всего, последняя) часть Истории игрушек.
P.S. Кстати, "Toy Story" был первый 3D-мультфильм, который я посмотрел тогда, ещё в детстве, в 1995 году. Мне было 13. А крутили тогда в основном разные "Утиные истории" и "Трансформеров". Но "Тоy Story" я полюбил больше всего.
P.S. Кстати, "Toy Story" был первый 3D-мультфильм, который я посмотрел тогда, ещё в детстве, в 1995 году. Мне было 13. А крутили тогда в основном разные "Утиные истории" и "Трансформеров". Но "Тоy Story" я полюбил больше всего.
OIT/A-buffer demo: improvements
После различных твиков разогнал демку OIT.
Ссылка: oit_dx11.zip
Скриншот:
Как видно, fps удалось поднять c 300 до 450 на той же сцене. Главным образом за счёт того, что:
a) Первый проход, в котором подсчитывается overdraw, заменён на fixed-function блендинг;
б) При сортировке алгоритм bitonic sort заменён на inline реализацию odd-even merge sort.
Также я приложил два .exe, второй использует structured buffer для хранения color и depth, но по каким-то причинам этот способ медленнее (хотя и более удобен для программирования).
P.S. Кстати, в прошлом варианте был баг (он обнаружился в Windows 7 64-bit), из-за чего программа не запускалась. Почему баг "прокатил" в моей 32-bit OS, непонятно.
And for english speaking guys:
BTW, there was a bug in the previous demo (it was detected on Windows 7 64-bit), because of this bug the program simply crashes on start. I don't know why it works on my 32-bit OS. The link to the new, unbuggy demo, is provided.
Update
Иду по улице, двигаю байтики в голове. Думаю над down-sweep: вот мы запускаем в массив нолик и он начинает путешествовать со сдвигом... Вдруг - бац! Там же ноль в начало буфера попадает, у меня же exclusive prefix sum! А значит, из пиксельного шейдера можно выкинуть movc и ещё пару инструкций, которые по недосмотру остались от демки из SDK!
Пришлось подправить шейдер и перезалить архив, а то глупо получилось....
Кстати, наткнулся на таблицу различий между Compute Shader 4.0 и 5.0:
http://www.legitreviews.com/article/1001/2/
Большая часть этой информации содержится в SDK, но в таблице есть одно уместное замечание:
Т. к. scattered write абсолютно необходим при аккумуляции фрагментов в пиксельном шейдере, можно сделать вывод, что A-buffer нереализуем в SM 4.0 (4.1). Уверен, это ограничение продиктовано недостатками архитектуры предыдущих чипов ATI.
Ссылка: oit_dx11.zip
Скриншот:
Как видно, fps удалось поднять c 300 до 450 на той же сцене. Главным образом за счёт того, что:
a) Первый проход, в котором подсчитывается overdraw, заменён на fixed-function блендинг;
б) При сортировке алгоритм bitonic sort заменён на inline реализацию odd-even merge sort.
Также я приложил два .exe, второй использует structured buffer для хранения color и depth, но по каким-то причинам этот способ медленнее (хотя и более удобен для программирования).
P.S. Кстати, в прошлом варианте был баг (он обнаружился в Windows 7 64-bit), из-за чего программа не запускалась. Почему баг "прокатил" в моей 32-bit OS, непонятно.
And for english speaking guys:
BTW, there was a bug in the previous demo (it was detected on Windows 7 64-bit), because of this bug the program simply crashes on start. I don't know why it works on my 32-bit OS. The link to the new, unbuggy demo, is provided.
Update
Иду по улице, двигаю байтики в голове. Думаю над down-sweep: вот мы запускаем в массив нолик и он начинает путешествовать со сдвигом... Вдруг - бац! Там же ноль в начало буфера попадает, у меня же exclusive prefix sum! А значит, из пиксельного шейдера можно выкинуть movc и ещё пару инструкций, которые по недосмотру остались от демки из SDK!
Пришлось подправить шейдер и перезалить архив, а то глупо получилось....
Кстати, наткнулся на таблицу различий между Compute Shader 4.0 и 5.0:
http://www.legitreviews.com/article/1001/2/
Большая часть этой информации содержится в SDK, но в таблице есть одно уместное замечание:
Unordered Access Views Bound to Pixel ShaderВ SDK прямо об этом не говорится. В разделе Using Compute Shader on DX10 написано:
Shader Model 4.0: Not supported
Shader Model 5.0: 8
Allows pixel shaders to access compute shader data for interoperability with rendering pipeline
Only one unordered access view can be bound to the shader.А в каком именно типе шейдеров доступен UAV - не сказано. Но если зайти в HLSL/Reference/Shader Models/Shader Model 5.0/Objects и прошерстить все объекты, то можно выяснить, что для RWByteAddressBuffer и RWStructuredBuffer сделана пометка Available for compute shader in Direct3D 11 on some Direct3D 10 devices.
Only RWStructuredBuffers and RWByteAddressBuffers are available as unordered access views.
Т. к. scattered write абсолютно необходим при аккумуляции фрагментов в пиксельном шейдере, можно сделать вывод, что A-buffer нереализуем в SM 4.0 (4.1). Уверен, это ограничение продиктовано недостатками архитектуры предыдущих чипов ATI.
воскресенье, 17 января 2010 г.
Третья ходка Януковича
Ну вот, приехали! Проффесор и Ко таки празднуют победу над "дерьмократическими" силами.
Держите шапки крепче, товарисчи украинцы! У руля становится кукла олигархов, ЗэКа, злостный рецидивист и просто бугай Бандюкович, а значит, в планах дальнейшего дерибана страны намечаются кардинальные перемены (Межигорье). С чем вас всех и поздравляю!
P.S. За Петровича всё-таки проголосовал ощутимый процент - 7-8%. Среди них и я. Это радует, что ещё остались в народе трезвовыслящие люди, верящие в молодых, перспективных политиков. Их немало. А теперь слова Яценюка для меня будут проходить проверку действием - действительно ли он, как и обещал, не будет объединяться ни с кем из "дерьмократических" сил и двигаться дальше во власть, возглавляя свою собственною партию, или же продастся одной из политических "горилл" в обмен на привилегии и должности?
P.P.S. А за базар Янык ещё ответит!
Держите шапки крепче, товарисчи украинцы! У руля становится кукла олигархов, ЗэКа, злостный рецидивист и просто бугай Бандюкович, а значит, в планах дальнейшего дерибана страны намечаются кардинальные перемены (Межигорье). С чем вас всех и поздравляю!
P.S. За Петровича всё-таки проголосовал ощутимый процент - 7-8%. Среди них и я. Это радует, что ещё остались в народе трезвовыслящие люди, верящие в молодых, перспективных политиков. Их немало. А теперь слова Яценюка для меня будут проходить проверку действием - действительно ли он, как и обещал, не будет объединяться ни с кем из "дерьмократических" сил и двигаться дальше во власть, возглавляя свою собственною партию, или же продастся одной из политических "горилл" в обмен на привилегии и должности?
P.P.S. А за базар Янык ещё ответит!
Подписаться на:
Сообщения (Atom)


