Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
как только доходит дело до продакшена, его ненативность быстро начинает раздражать конечных пользователей.Постойте, но ту же мобильную версию 2gis разве не на Qt делают?

свой визуализатор линий
partsize = fullsize/5.0;
xcoord = 0;
for (i=0; i<=5.0; i++)
{
//рисуем вертикальную линию в xcoord (но рисуем возможно со смещением, смотрите коммент к проблеме 5)
xcoord += partsize;
}
Погрешность накопилась из-за того, что вы все время прибавляли значение. А рисовать надо было так:for (i=0; i<=5.0; i++)
{
xcoord = fullsize*i/5.0;
//рисуем вертикальную линию в xcoord
}
Тогда проблем бы не было.




По первой проблеме — вы как-то ловко пропустили тот момент, что при включении scissor test’а погрешность изменяется.Скроллинг и зумминг никак не связан с этим. В этом случае привязка к границам сетки должна дополнительно осуществляться в вершинном шейдере, а вершины должны иметь необходимую информацию о привязке.
График должен быть интерактивным, то есть должнен скроллиться и зумиться.
И проблема даже не в ретесселяции. Проблема в том, чтобы держать толщину линий одинаковой на разных масштабах контура. Не сказать, что это прямо так уж сложно, но сомнительно, что удастся уложиться в пару десятков строк кода :)Ну шейдер же. Вы думаете почему линии выкидывают из АПИ? Не гибко и держать код растеризации на пайплайне — неудобно.
Про дырки между полигонами — там мы как раз ничего не прибавляем. И круг мы замыкаем (точнее, используем для начала следующего сектора координаты конца предыдущего). Тем не менее, такой вот спецэффект присутствует.Увы, такого не может быть. Иначе во всех 3д моделях в играх были бы такие же дырки. :)
Проблема в том, что у секторов есть ещё стенки (так как они могут выезжать из пирога и висеть рядом с ним). И вот то, что видно — это как раз не фон, а эта самая стенка, потому что в одном месте оказываются два стыкующихся полигона и один перпендикулярный им <картинка>Ну во-первых я однозначно вижу фон (цвет нижележащего блина), а во-вторых — я вижу что у вас на той картинке, где эти самые блины — увеличение не из той области идет. Должно быть на 1 блин ниже. Ну и в-третьих — стенки должны тоже иметь общие координаты. Тогда не будет никакой погрешности в буфере глубины. Так что это целиком ваша погрешность, а не растеризации.
А если писать свой антиалиасинг — так за компанию и от артефактов защититься решили.Не заметил разницы между вашим антиалясингом и MSAA. Вы просто область для сравнения взяли удачную. И постпроцессовый антиалясинг (тот же FXAA например) — это полное фиаско для однопиксельных линий, идущих под углом.
Те же glTexImage2D или glBufferData вполне себе синхронные.То есть параллельность только для того, чтобы memcpy выполнялся в отдельном потоке? Хм…
Главное — это обратная ситуация: когда заблокирован main-thread, например, при обновлении данных.Так это вообще странное решение. Т.е. вместо того чтобы вынести обновление данных, которое блокирует main-thread — вы выносите рендеринг? При этом тред все равно заблокирован, пользователь не может ничего сделать, зато он может посмотреть как у него рендерится сцена, которая реально рендерится только когда что-то изменилось?
Или, ещё пример, на iOS, если на экране есть table view controller со включенной «пружинкой» и пользователь оттянул эту пружинку и держит, главный поток стоит с замиранием сердца ждёт, что же будет. И вот тут-то хотелось бы, чтобы анимация продолжала плавно проигрываться.Не работал с iOS, не могу ни подтвердить ни опровергнуть, но глядя на эти «проблемы» немного сомневаюсь что на iOS main thread блокируется наглухо (не приходят евенты ни таймеров, ни перерисовки)
Скроллинг и зумминг никак не связан с этим. В этом случае привязка к границам сетки должна дополнительно осуществляться в вершинном шейдере, а вершины должны иметь необходимую информацию о привязке.Поясните, что значит «привязка к сетке в вершинном шейдере» и какую такую информацию должны иметь вершины?
Ну шейдер же. Вы думаете почему линии выкидывают из АПИ? Не гибко и держать код растеризации на пайплайне — неудобно.Да, насчёт шейдера — да, сам по себе механизм не такой сложный. Но тут проблема не только в механизме, но ещё и в рефакторинге имеющегося кода.
Увы, такого не может быть. Иначе во всех 3д моделях в играх были бы такие же дырки. :)В играх стараются не допускать ситуации, которую мы показали тут: habrahabr.ru/post/230671/#comment_7811885


Не заметил разницы между вашим антиалясингом и MSAA. Вы просто область для сравнения взяли удачную. И постпроцессовый антиалясинг (тот же FXAA например) — это полное фиаско для однопиксельных линий, идущих под углом.Так во внешнем виде её особой и нет. Есть разница в производительности, потому что наш АА можно быстро отключить на период проигрывания анимации и включить обратно, когда картинка «устаканилась». Кроме того, у нас же не только постпроцессинговый, у нас гибрид SSAA и FXAA.
То есть параллельность только для того, чтобы memcpy выполнялся в отдельном потоке? Хм…Да, и плюс ещё обсчёт анимаций и все вспомогательные преобразования. Но ещё раз: это не главное, главное — обратная ситуация.
Так это вообще странное решение. Т.е. вместо того чтобы вынести обновление данных, которое блокирует main-thread — вы выносите рендеринг? При этом тред все равно заблокирован, пользователь не может ничего сделать, зато он может посмотреть как у него рендерится сцена, которая реально рендерится только когда что-то изменилось?В общем случае, действительно, обновление данных стоит выносить в отдельный поток. Но мы-то пишем компонент, который должен быть готов к разным ситуациям. И наличие плавных анимаций, не зависящих от нагруженности main thread-a — важный момент. «Когда что-то изменилось» включает в себя и воспроизведение анимаций, естественно.
Не работал с iOS, не могу ни подтвердить ни опровергнуть, но глядя на эти «проблемы» немного сомневаюсь что на iOS main thread блокируется наглухо (не приходят евенты ни таймеров, ни перерисовки)В описанной ситуации — наглухо.
Поясните, что значит «привязка к сетке в вершинном шейдере» и какую такую информацию должны иметь вершины?Например что вершину можно двигать вправо-влево/вверх-вниз на пол пикселя. И двигать как-то так:
coord.xy = round(coord.xy*0.5)*2.0;
Ну и именно из-за того, что стенка имеет одни и те же координаты с боковинами, происходит ситуация «борьбы» в z-буфере, потому что на этапе растеризации у фрагментов разных полигонов оказывается одинаковая глубина.Ок, но боковина почему у вас имеет другие координаты? Если бы она имела те же координаты — не было бы z-fiting-а. Вы мне сейчас рассказываете те вещи, которые я итак прекрасно знаю, т.к. я уже лет 8 работаю с DirectX и OpenGL. Есть кстати такая техника, называется Depth prepass. Это когда сцену сначала рисуют только в буфер глубины. Потом эту же сцену рисуют снова, но уже в колор буфер без записи в глубину но с тестом глубины glDepthFunc(GL_EQUAL). Если бы на этапе растеризации были бы погрешности — оно бы вообще через пиксель все рисовалось, и просто файтилось бы.
Так во внешнем виде её особой и нет. Есть разница в производительности, потому что наш АА можно быстро отключить на период проигрывания анимации и включить обратно, когда картинка «устаканилась». Кроме того, у нас же не только постпроцессинговый, у нас гибрид SSAA и FXAA.У меня просто удивительно так совпало наверное. Сейчас пилю рендер, в нем есть рейтрейсинг, ну и из-за этого края, отрезанные рейтрейсингом не сглаживаются MSAA. Мне не досуг было думать, и я в качестве временного решения впихнул «гибрид» SSAA и FXAA. :) Вот так совпало, да. Потому что у меня однопиксельные линии есть (FXAA не подойдет), поэтому я делаю SSAA, линии становятся двухпиксельными, и я прохожу FXAA.
Например что вершину можно двигать вправо-влево/вверх-вниз на пол пикселя. И двигать как-то так:Если coord.xy в экранных координатах — да. Но у нас-то задача выровнять по пикселям и то, что в экранных, и то, что в координатах сцены (а там у нас изначальные значения от –1.0 до 1.0, и округление уведёт их в 0). Суть в том, что линии сетки существуют в пространстве графика, то есть в системе координат сцены. А риски на оси — в пространстве экрана, потому что они торчат за пределы области графика (а эту область мы ограничиваем scissor-ом). И тут важно не только, чтобы и те, и другие были выровнены по сетке пикселей, но и чтобы они совпадали пиксель в пиксель друг с другом (то есть чтобы риски были «продолжением» линий сетки).
coord.xy = round(coord.xy*0.5)*2.0;
Ок, но боковина почему у вас имеет другие координаты? Если бы она имела те же координаты — не было бы z-fiting-а. Вы мне сейчас рассказываете те вещи, которые я итак прекрасно знаю, т.к. я уже лет 8 работаю с DirectX и OpenGL. Есть кстати такая техника, называется Depth prepass. Это когда сцену сначала рисуют только в буфер глубины. Потом эту же сцену рисуют снова, но уже в колор буфер без записи в глубину но с тестом глубины glDepthFunc(GL_EQUAL). Если на этапе растеризации были бы погрешности — оно бы вообще через пиксель все рисовалось, и просто файтилось бы.Во-первых, координаты стенки именно что те же самые. А во-вторых, хорошо, что вам повезло так и не столкнуться с такой вот ситуацией, когда то, что вы называете погрешностью интерполяции, возникает на границе перпендикулярных полигонов. Но это же не значит, что так в принципе не бывает.
А то что вы привели пример с блендера — это да, погрешность на этапе интерполяции. Пиксель же у нас квадратный, и глубина для него считается в центре, а проекция — перспективная. Но у вас то другая ситуация. У вас стенка может иметь те же координаты, что и кольцо вокруг. Но у вас она имеет «свои» координаты. Так чот эта погрешность создана вами, на CPU.
У меня просто удивительно так совпало наверное. Сейчас пилю рендер, в нем есть рейтрейсинг, ну и из-за этого края, отрезанные рейтрейсингом не сглаживаются MSAA. Мне не досуг было думать, и я в качестве временного решения впихнул «гибрид» SSAA и FXAA. :) Вот так совпало, да. Потому что у меня однопиксельные линии есть (FXAA не подойдет), поэтому я делаю SSAA, линии становятся двухпиксельными, и я прохожу FXAA.По сути, основную идею вы сами озвучили: действительно, сначала делаем SSAA, затем поверх него FXAA. Общая производительность в целом получается такой же, как у MSAA, но выигрыш в том, что на периоды воспроизведения анимации мы отключаем антиалиасинг вообще. Поэтому у пользователя складывается ощущение плавности движений — но, конечно, ценой того, что пока сцена в движении, она не сглаживается.
Но производительность SSAA ни в какие ворота не лезет, по сравнению с производительностью MSAA. Так что я не знаю откуда у вас там прирост. Но если оно действительно так, то это очень круто, и лучше бы вы поделились с сообществом этой технологией, чем постом выше.
Тоже когда-то грезил рендером в отдельном потоке. Но на практике оказалось — себе дороже. Отдельный поток нужен, если у тебя например тяжелая физика и относительно тяжелый рендер в одном потоке, и то только пожалуй для того, чтобы тяжелой физике было легче. Я в курсе что это не ваше изобретение, но в данном случае я не вижу уместности такому огромному велосипеду.Ну да, мультитред — это сложно :) Но как раз тут это оказалось важно. Особенно для мобилок, которые, с одной стороны, довольно маломощные, с другой — во многих по два и больше ядер, так что два потока там хорошо уживаются и дают ощутимый для пользователя результат. Ну и велосипед — хотя, конечно, и не двадцать строчек кода — не такой уж и огромный :-)
Если coord.xy в экранных координатах — да. Но у нас-то задача выровнять по пикселям и то, что в экранных, и то, что в координатах сцены (а там у нас изначальные значения от –1.0 до 1.0, и округление уведёт их в 0). Суть в том, что линии сетки существуют в пространстве графика, то есть в системе координат сцены. А риски на оси — в пространстве экрана, потому что они торчат за пределы области графика (а эту область мы ограничиваем scissor-ом). И тут важно не только, чтобы и те, и другие были выровнены по сетке пикселей, но и чтобы они совпадали пиксель в пиксель друг с другом (то есть чтобы риски были «продолжением» линий сетки).Простите, но вы сейчас говорите чушь, которая только подтверждает, что никакого понимания процесса рендеринга, у вас нет. Как и понимания линейной алгебры. Выравнивать по пиксельной сетке нужно после умножения на матрицу проекции. После этого умножения получаются однородные координаты, эти однородные координаты нужно перевести в декарторвы координаты куба [-1;1] (coord.xy /= coord.w), по которому будет растеризация, эти координаты куба перевести в координаты пикселей [0;ViewPortSize] (coord.xy += 1.0; coord.xy *= ViewPortSize*0.5), выровнять по пиксельной сетке (coord.xy = round(coord.xy*0.5)*2.0), перевести все это дело обратно: ( coord.xy /= ViewPortSize*0.5; coord.xy -= 1.0; coord.xy *= coord.w).
Во-первых, координаты стенки именно что те же самые. А во-вторых, хорошо, что вам повезло так и не столкнуться с такой вот ситуацией, когда то, что вы называете погрешностью интерполяции, возникает на границе перпендикулярных полигонов. Но это же не значит, что так в принципе не бывает.Строим правильный меш, и так гарантирванно не бывает. Строим не правильный меш — бывает. Вы построили неправильный меш.
Без АА: 15 fps, MSAA: 5 fps, SSAA: 4.5 fps, FXAA: 8 fps, наш гибрид (когда он включен): 4.5 fps.Ну то есть не совпадает по производительности, как у вас в статье, а медленнее.
сцена 1 600 000 треугольниковпонятно, что вы не понимаете преимущество MSAA над SSAA, как и то, что при таком количестве геометрии MSAA запросто вырождается в SSAA.
Вы как-то очень легко рассуждаете о том, что мы знаем, а чего нет. Я же не говорю, например, что вы не знаете способы оптимизации и структурирования приложений, пока вы так упорно не соглашаетесь, что разделять рендеринг и main thread — это хороший тон.Даже если рендеринг просто делает glClear?
Вы обвиняете нас в использовании «некрасивых костылей», а сами при этом предлагаете костыли едва ли не хуже. Да, после развёрнутого объяснения стало понятно, какой именно ужас вы имеете в виду. И да, этот ужас — при должном старании — тоже будет работать.Это не ужас, и не костыли. Ваши 10000.0 легко расползутся в другом месте. И в данный момент они работают только для конкретно этой рамочки, и только для определенного круга разрешений. То что я предложил — гарантированно выравнивает все линии по пиксельной секте вне зависимости от разрешения, скроллинга, зума. Оно не будет показывать муть в подобных гридах:
при использовании сглаживания, а вам, чтобы это побороть — придется для каждой линии грида подобрать свои N тысяч.Напоминаю, что мы ориентируемся на мобильные устройства, на которых дополнительные инструкции в коде шейдера крайне нежелательны.Вот этот аргумент особенно смешно звучит в контексте того, что вы используете GL_LINES. GL_LINES на порядок медленнее, чем те преобразования, которые я привел. Кроме того преобразования в координаты вьюпорта — необходимы для рисования линий через треугольники. Так что эти преобразования в любом случае делать.
Вы ставите диагноз по фотографии, утверждаете: «у вас неправильный меш», не потрудившись проверить подобную ситуацию, опираясь только на свой опыт — и, кстати, не потрудившись поинтересоваться опытом собеседника. Из-за этого беседа сводится к «я д’Артаньян, а вы — лоботрясы».В данном случае фотографии достаточно. Но вы же не верите, вам же доказательтсва надо, ведь так? Вот на скорую руку (но по факту убил полтора часа времени) набросал семпл:
Невероятно! Ничего нигде не торчит. Но если бы я просто залил скриншот — никто бы мне не поверил. Поэтому вот демка в которой можно покрутить правой кнопкой мыши диаграмму, погенерировать новую, а так же залелеть внутрь, и убедиться что все стенки на месте.Насчёт понимания/непонимания преимущества MSAA над SSAA — при чём тут это вообще? Кроме того, по крайней мере на мобильных устройствах, падение производительности в три раза при MSAA — это довольно постоянная вещь, на сцене с меньшим количеством геометрии результат тот же.
Что касается производительности — да, наш способ медленнее MSAA. В итоге, пользователь получает на выходе 4.5 FPS против 5 FPS. Офигенно критичная разница.Расскажите, как вы понимаете принцип работы MSAA, и объясните, почему в качестве теста производительности между SSAA и MSAA вы выбрали сцену с 1 600 000 треугольников?
Только наш АА выключается автоматом и быстро, а включать и выключать MSAA на лету можно, но это требует заметно больше времени. Особенно хватает нюансов с этим на андроиде. Да и не только там, на iOS тоже. У вас, видимо, какая-то специальная параллельная реальность, где ни отключение MSAA, ни отрисовка отдельных кадров не требуют времени, а мобильные устройства, вероятно, ничем не отличаются от десктопа.И расскажите, как вы видите включение/отключение MSAA, и в чем принципиальная разница включения/отключения MSAA от включения/отключения вашего SSAA?
В статье мы просто хотели показать, что иногда приходится запиливать некрасивые костыли во имя красивого результата.В статье вы показали, что вообще не умеете работать ни с плавающей точкой, ни линейной алгеброй. Из-за этого вы запилили некрасивые костыли, которые на самом деле никакой красивости не дали. Они просто там есть:

Даже если рендеринг просто делает glClear?Может быть, всё-таки стоит говорить о реальных вещах?
Расскажите, как вы понимаете принцип работы MSAA, и объясните, почему в качестве теста производительности между SSAA и MSAA вы выбрали сцену с 1 600 000 треугольников?
И расскажите, как вы видите включение/отключение MSAA, и в чем принципиальная разница включения/отключения MSAA от включения/отключения вашего SSAA?Да, чем больше геометрии, тем MSAA медленнее. Ну и что? Мы тестировали на пиковой нагрузке. Вот другая ситуация: iPad 1, 1000 треугольников, но довольно нагруженный шейдер отрисовки. MSAA даёт 14 fps, наш — 6 fps. Но при этом наш почти мгновенно выключается, так что все движения — на скорости 60 fps.
Невероятно! Ничего нигде не торчит. Но если бы я просто залил скриншот — никто бы мне не поверил. Поэтому вот демка в которой можно покрутить правой кнопкой мыши диаграмму, погенерировать новую, а так же залелеть внутрь, и убедиться что все стенки на месте.Нда, отличная демка, порадовавшая нескучной надписью «Access violation at address 00000000» при запуске. Пришлось смотреть, что же мы делаем не так. Проблема оказалась в следующем: получили вы адреса gl*EXT функций, отлично. Но, видимо, вы так спешили, что написать проверку их на NULL уже не успели. Если в вашем OpenGL драйвере существует функция glNamedBufferDataEXT, это не значит, что она есть всегда и у всех. Конец немного предсказуем. Ладно, плохие драйверы, бывает. Запустим демку на свежем компьютере… запустилась, но показывает красивый чёрный экран. Что на этот раз? Не линкуются шейдеры…


Из-за этого вы запилили некрасивые костыли, которые на самом деле никакой красивости не дали. Они просто там естьВ размытости слов «Наш антиалиасинг» тоже наши костыли виноваты? Все претензии к habrastorage, пережавшему вот эту картинку. Вообще, там прекрасно видны волны вокруг прямых линий, уж можно было догадаться, что картинка пожата.
В статье вы показали, что вообще не умеете работать ни с плавающей точкой, ни линейной алгеброй.Прежде, чем разговаривать в таком тоне, нужно как минимум изучить линейную алгебру и графический конвеер (ц).
Да, чем больше геометрии, тем MSAA медленнее. Ну и что? Мы тестировали на пиковой нагрузке. Вот другая ситуация: iPad 1, 1000 треугольников, но довольно нагруженный шейдер отрисовки. MSAA даёт 14 fps, наш — 6 fps. Но при этом наш почти мгновенно выключается, так что все движения — на скорости 60 fps.Ну то есть я вас убедил таки проверить на более реальных количествах данных, а не на абстрактных 1 600 000?
Включение/выключение MSAA на мобильных устройствах требует пересоздания рендербуферов. Кроме того, на разных платформах это будет делаться по-разному, что усложняет портирование. Наш механизм работает внутри движка, так что отключение оказывается удобнее. Ну и быстрее, так как нам не нужно изменять основной рендербуфер — что особенно актуально на андроидах, где пересоздание контекста может занимать до секунды (!).Вы уверены что не путаете рендербуфер с контекстом? Зачем рендербуфер пересоздавать? Почему нельзя хранить его, и просто не рисовать в него?
Нда, отличная демка, порадовавшая нескучной надписью «Access violation at address 00000000» при запуске. Пришлось смотреть, что же мы делаем не так. Проблема оказалась в следующем: получили вы адреса gl*EXT функций, отлично. Но, видимо, вы так спешили, что написать проверку их на NULL уже не успели. Если в вашем OpenGL драйвере существует функция glNamedBufferDataEXT, это не значит, что она есть всегда и у всех. Конец немного предсказуем. Ладно, плохие драйверы, бывает. Запустим демку на свежем компьютере… запустилась, но показывает красивый чёрный экран. Что на этот раз? Не линкуются шейдеры…Да, печально. Код создавался на базе другого, использующего OpenGL 3.3. Я понимаю, что вы с разбегу стали его тестить на всем всем всем, чтобы показать, насколько я некомпетентен, и что меня не хватило (после убитых полутора часов на диаграмму), на обработку того, что на девайсе не поддерживается GL3.3 и не поддерживаются никакие расширения, которые необходимы.
Бог троицу любит, и на третьем компьютере она-таки запустилась.Ну хорошо, в 2014 году вы нашли компьютер с поддержкой OGL3.3. и даже с установленными драйверами.
На первый взгляд всё в порядке, и торчащих пикселов не видно. Объясняется это просто: у вас используется 24-битный буфер глубины, у которого проблем с точностью практически не возникает.Ну да ну да. Вы убедили меня собрать демку с 16 битным буфером глубины. Найдете существенную разницу?
спецификация OpenGL ES 2.0 не гарантирует, что более точный буфер глубины будет доступен.А можно пруф? Очень интересно где спецификация гарантирует 16 битный буфер глубины? Потому что на десктопах ситуация ровно противоположная.
Вращаем барабан… и через пару десятков секунд выпадает сектор «приз»:Дада, а потом смотрим на мою диаграмму, смотрим на свою, считаем разницу в пикселях. 20 секунд кручения ради 1 пикселя, против десятков пикселей в каждом фрейме. Как вы объясните столь огромную разницу? Точность глубины? Вон демка на 16бит есть выше.
В размытости слов «Наш антиалиасинг» тоже наши костыли виноваты? Все претензии к habrastorage, пережавшему вот эту картинку. Вообще, там прекрасно видны волны вокруг прямых линий, уж можно было догадаться, что картинка пожата.Графический процессор дает некотролируемые погрешности. Хабрасторадж неконтролируемо пережимает картинки. Прям все против вас :)
Вы почему-то постоянно забываете о том, что библиотека используется и на мобильных девайсах (а по факту, в основном на них). Упорно твердите, что причина дырок между полигонами — «неправильный» меш, забывая о том, что не у всех есть такие красивые и глубокие буферы. Рассказывая об антиалиасинге, не вспоминаете о том, что старые андроиды по производительности ближе к нокии 3310, чем к iphone 5. Да даже ваша собственная демка для вашей собственной винды демонстрирует, что вы оперируете очень малым количеством ситуаций.Демка на меелкий буфер выше. А по поводу антиалясинга — это вообще класс. SSAA — последнее, что бы я стал делать даже на десктопах, не говоря уже про мобильники. Вы знаете как дать в пах производительности (1000 треугольников, MSAA даёт 14 fps, наш — 6 fps), но при этом кичитесь тем, что вам так важна эта производительность. Ну а моя демка оперирует малым количеством ситуаций, потому что это демка. Я итак убил на нее полтора часа. Еще полтора я на неё убивать не собираюсь, чтобы она запускалась на мыльницах.
Вы, конечно, опытный теоретик, и очень убедительно учите всех жизни, но критерием истины по-прежнему остаётся практика. И эта самая практика прекрасно показала, чего стоят восемь лет вашего опыта.Да, я восемь лет теоретизировал тут сидел, так все и было.
Прежде, чем разговаривать в таком тоне, нужно как минимум изучить линейную алгебру и графический конвеер (ц).Я уже просто понял, что вам все божья роса. Не вижу смысла продолжать данный диалог. Изначально цель была донести, что вам нужно изучать сабж, прежде чем такие статьи на хабре писать, а уж тем более продавать коммерческий продукт (хотя я знаю, и не такое продается). Цель не удалась, вы почему-то стали убеждать меня, что я не прав, вот и вышел такой тон. Но я надеюсь кто-то прочтет это, и не купит ваш продукт. Тогда от данной переписки будет хоть какая-то польза.
Вы знаете как дать в пах производительности (1000 треугольников, MSAA даёт 14 fps, наш — 6 fps), но при этом кичитесь тем, что вам так важна эта производительность.
1. Снижение производительности: по нашим наблюдениям, на мобилках она падает в среднем в три раза, и при воспроизведении анимации на сложных сценах появляются ощутимые лаги.
2. Затруднение мультиплатформенности (а мы за ней гоняемся): на разных платформах системный антиалиасинг включается по-разному, мы же пытаемся по максимуму унифицировать код.
Well, welcome to OpenGL world. :)
I hope you will survive extension hell. :)
То есть чтобы отключить системное сглаживание надо сходить в JVM и вернуться обратно.Т.к. автор статьи использует самопальный SSAA, то эмулирует он его через Framebuffer, и делает рендер в текстуру. Отключение такого SSAA — просто перестаем ренедерить в FBO, рендерим сразу в окно, это очень быстро. Но MSAA точно так же можно рендерить в FBO. И такой MSAA включается одинаково на всех платформах. В общем нет вообще никакой принципиальной разницы, кроме того, что нельзя напрямую постпроцессить такую текстуру.
Особенно учитывая, что гугление на тему разрядности буфера глубины на первой же странице выдаёт некий пост с таким приветствиемНаиболее популярный буфер — это Depth24Stencil8. Я еще не встречал девайса, не поддерживающего такого буфера (исключая совсем раритетные карточки, типа S3 Virge GX2). А вот с 16-ти битными буферами даже на десктопах у меня были проблемы. Автор статьи кстати в комментариях утверждает:
У нас в режиме совместимости со старыми девайсами используется 16-битный: спецификация OpenGL ES 2.0 не гарантирует, что более точный буфер глубины будет доступен.и мне очень бы хотелось получить пруф.
не для GL3.3, а для OpenGL ES, iOS и Android. Причём очень желательно для OpenGL ES 2.0 и 3.0. И чтоб портабельно. Что-то мне подсказывает, что уважаемый топикстартер всё же не в первый раз видит матчасть.Ну причем тут вообще OpenGL ES то? Математика же одна и та же. Посмотрите на что больше всего жалуется автор. Что там, в ГПУ неконтролируемые погрешности. Мол вот у меня линии смазаны. Но линии надо просто привязывать по пиксельной сетке в вершинном шейдере. Вы думаете будет какая-то разница между GL3.3 и ES 2.0?
Т.к. автор статьи использует самопальный SSAA, то эмулирует он его через Framebuffer, и делает рендер в текстуру. Отключение такого SSAA — просто перестаем ренедерить в FBO, рендерим сразу в окно, это очень быстро. Но MSAA точно так же можно рендерить в FBO. И такой MSAA включается одинаково на всех платформах. В общем нет вообще никакой принципиальной разницы, кроме того, что нельзя напрямую постпроцессить такую текстуру.
Я прекрасно знаю, где в ОГЛ кроссплатформенный код, а где нет (ибо писал кроссплатформенный рендер под линуксы). Так что отключается и включается MSAA очень быстро, если использовать FBO (который итак используется для SSAA сейчас).Android != GNU/Linux. Мобильное устройство != персональный компьютер. OpenGL != OpenGL ES. Каким образом вы собираетесь создать на ES 2.0 рендербуфер с поддержкой мультисемплинга?
и мне очень бы хотелось получить пруф.www.khronos.org/registry/gles/specs/3.0/es_spec_3.0.2.pdf, страницы 315, 316.
Каким образом вы собираетесь создать на ES 2.0 рендербуфер с поддержкой мультисемплинга?Посмотрел в спецификации ES2.0. Увы, да, там только через экстеншн. Начиная с ES3.0 — InCore.
Рендеринг диаграмм: не так просто, как кажется