Войти
ПрограммированиеФорумГрафика

Параметрическое размытие теней (2 стр)

Страницы: 1 2 3 Следующая »
#15
13:34, 29 июля 2014

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

#16
13:35, 29 июля 2014

Kozinaka
> Боюсь, все предложенные решения требуют хранения тени отдельным спрайтом, а это
> в два раза больше памяти, чем уже занимают спрайты.
Ну для Signed Distance Field достаточно хранить одноцветную текстуру. Это как минимум в 4 раза меньше чем классическая RGBA. Ну и SDF текстура как правило низкого разрешения, я думаю нормально будет смотреться текстура в 4 раза меньше по ширине и высоте от текущей. Итого в 16 раз меньшей по площади. И в этом случае на SDF памяти понадобится в 64 раза меньше.


Kozinaka
Да, тяжелая операция. Передача 20 float в шейдер - тяжелая для CPU операция. 20 выборок из текстуры - тяжелая для GPU операция. Но это все относительно.

upd. 20 float - тяжелая, потому что вообще установка юниформа тяжелая операция. Ну т.е. между устновкой 1 флоата и установкой 20 флоатов - разница крошечная.

#17
13:55, 29 июля 2014

MrShoor
>upd. Ну т.е. между устновкой 1 флоата и установкой 20 флоатов - разница крошечная.
Оу, это меняет расклад. Я не могу обойтись без передачи в шейдер степени размытия. Если я уже плачу за этого дорого, то почему бы и не затолкать уже сформированную функцию распределения весов пикселей за ту же цену? :)

С другой стороны Signed Distance Field выглядит очень заманчиво в плане рантайма - шейдер простой, быстро работает.

#18
13:57, 29 июля 2014

Kozinaka
> С другой стороны Signed Distance Field выглядит очень заманчиво в плане
> рантайма - шейдер простой, быстро работает.
Если тебе не нудны полутени - оно в самый раз.

#19
14:00, 29 июля 2014

Kozinaka
> Оу, это меняет расклад. Я не могу обойтись без передачи в шейдер степени
> размытия. Если я уже плачу за этого дорого, то почему бы и не затолкать уже
> сформированную функцию распределения весов пикселей за ту же цену? :)
Ну я вот в данный момент занимаюсь тем, что выпиливаю установку юниформов на каждый дип, т.к. в моем конкретном случае оно оказывается дорого. Говорю же все относительно.

#20
14:01, 29 июля 2014

-Eugene-
>Если тебе не нудны полутени
А что ты имеешь в виду под полутенями?

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

MrShoor
>Ну я вот в данный момент занимаюсь тем, что выпиливаю установку юниформов на каждый дип
Спасибо за подсказку! Если параметр, передаваемый в шейдер, остался прежним, то не надо его толкать почём зря. Выпилю у себя тоже. :)

#21
14:06, 29 июля 2014

Kozinaka
> А что ты имеешь в виду под полутенями?
Тени от полупрозрачных предметов

#22
14:11, 29 июля 2014

-Eugene-
>Тени от полупрозрачных предметов
Есть такие. Например крылья у мухи. Самые что ни на есть полупрозрачные. Ещё жуки летающие будут, тоже с крыльями.

#23
14:19, 29 июля 2014

Kozinaka
Вот. А SDF нельзя (вроде бы) сгенерировать для таких. Только для монохромных теней.

#24
15:08, 29 июля 2014

Желательно все-таки теневые спрайты хотя бы в момент загрузки сгенерить, и лучше с в 2-3 раза меньшим разрешением, чем сами цветные спрайты.
Это уже обеспечит хоть какой-то базовый блюр, избавит от избыточной нагрузки (меньше пикселей шейдить), объем хранимых спрайтов (к тому же если они 8битные), и расширит максимальную разблюренность, учитывая ограниченное количество коэффицентов.

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

http://www.gamerendering.com/2008/10/11/gaussian-blur-filter-shader/

Это первая мысль профана.

А вторая мысль, что с десяток уровней размытости уже будет достаточно.

#25
15:14, 29 июля 2014

Чем не нравится вариант с мипами? Я реализовывал такой алгоритм для полноэкранного размытия - можно дешево получать как четкое изображение, немного размытие и полностью размытое. Цикл небольшой там 8-10 тактов. На все уходило < 1мс.
В вашем случае объекты маленькие и разрешение текстур думаю тоже небольшое. Тактов 4-6 вполне хватит. Никаким параметрическим блюром такое не сделать (дешево).
Плюс, я так понял что спрайты анимированные-готовые уже? тогда процесс упрощается. заранее генерим мипы (в оффлайне) и потом рисуем мягкие тени. Время на рендер будет около 0.5мс, если не меньше.
З.Ы. Даю подсказку - Pyramid Methods in GPU-Based Image Processing.

#26
15:20, 29 июля 2014

Разработка на мобильники? может быстрее будет использовать две текстуры тени (генерить или заранее красиво нарисовать: четкая + размытая) и степень размытости регулировать лерпом? :)

#27
15:29, 29 июля 2014

Dexus
>Желательно все-таки теневые спрайты хотя бы в момент загрузки сгенерить
Думаю так и придётся делать. До этого как-то обходился без этого, потому что стоит ввязаться, как захочется их теперь в памяти как-то паковать пооптимальней, а размера спрайты все разного.
Есть какие-нибудь готовые решения по автоматическому раскидыванию спрайтов в атласы на лету?

> от избыточной нагрузки (меньше пикселей шейдить)
Разве нагрузка на пиксельный шейдер зависит не количества пикселей на выходе?

> с десяток уровней размытости уже будет достаточно.
По части отражения ситуации - безусловно достатчно, но в динамике ступеньки могут внимание привлекать при плавном изменении высоты (а оно именно такое и есть).

fullspektr
>Чем не нравится вариант с мипами?
Не нравится хранить тени отдельными спрайтами вообще, но если это неизбежно, то какого-то отторжения мипов у меня нет. :)
Другой вопрос, что я пока генерю их автоматом и никогда не пробовал делать это вручную. Просто тёмная для меня тема пока.

>Цикл небольшой там 8-10 тактов. На
Это размытие в несколько этапов? Или это количество используемых мип-уровней?

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

akaAngeL
> Разработка на мобильники? может быстрее будет использовать две текстуры тени
> (генерить или заранее красиво нарисовать: четкая + размытая) и степень
> размытости регулировать лерпом? :)
Не, пока для десктопа. Чтобы портировать нужно иметь игру, а её у меня полноценной пока нет. :)
Что такое лерп? Получается имитация мипмаппинга?

#28
15:49, 29 июля 2014

Kozinaka
Я наверное пропустил, но как ты сейчас делаешь тени? Я так понял это не спрайты. Это шадоумапа или что?

> Что такое лерп?

Линейная интерполяция.

#29
15:51, 29 июля 2014

Основная идея здесь
http://en.wikipedia.org/wiki/Gaussian_blur

Я у себя делал размытие по 9 точкам по заранее рассчитанной матрице (параметры: kernelValue - это как раз степень размытости, сама матрица для убыстрения расчетов считалась на CPU в зав-ти от sigma. Я делал специальный спрайт где одним из параметров было как раз размытие от 0 (четко) до 1 (полностью размытая)).
u_offset_step - это шаг по текстуре (т.е. для текстуры 256х256 шаг будет 1/256, а все текстуры были квадратными)

#ifdef GL_ES
precision highp float;
#endif

varying vec4    v_fragmentColor;
varying vec2    v_texCoord;
uniform sampler2D  CC_Texture0;

// user data's
uniform vec2    u_offset_step;    // array of offsets for accessing the base image
uniform float    u_kernelValue[9];  // value for each location in the convolution kernel

void main()
{
    gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);

  vec2 texCoord = v_texCoord - u_offset_step;
  gl_FragColor += u_kernelValue[0] * texture2D(CC_Texture0, texCoord);

  texCoord.y = v_texCoord.y;
  gl_FragColor += u_kernelValue[1] * texture2D(CC_Texture0, texCoord);

  texCoord.y += u_offset_step.y;
  gl_FragColor += u_kernelValue[2] * texture2D(CC_Texture0, texCoord);

  texCoord = v_texCoord - vec2(0.0, u_offset_step.y);
  gl_FragColor += u_kernelValue[3] * texture2D(CC_Texture0, texCoord);

  texCoord.y = v_texCoord.y;
  gl_FragColor += u_kernelValue[4] * texture2D(CC_Texture0, texCoord);

  texCoord.y += u_offset_step.y;
  gl_FragColor += u_kernelValue[5] * texture2D(CC_Texture0, texCoord);

  texCoord = v_texCoord + vec2(u_offset_step.x, -u_offset_step.y);
  gl_FragColor += u_kernelValue[6] * texture2D(CC_Texture0, texCoord);

  texCoord.y = v_texCoord.y;
  gl_FragColor += u_kernelValue[7] * texture2D(CC_Texture0, texCoord);

  texCoord.y += u_offset_step.y;
  gl_FragColor += u_kernelValue[8] * texture2D(CC_Texture0, texCoord);

  gl_FragColor *= v_fragmentColor;
}

Сказать, что это тормозило на iPad1 - ничего не сказать...
При добавлении двух текстур 256х256 FPS резко сдавал с приемлемых 50-60 до 4-5 ФПС. На iPad2 текстур было побольше (3-4), но и там просадка была до 10 фпс.
Как итог разумеется все выбросили.

Страницы: 1 2 3 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.