|
|
|
Канал Игры Мечты: «HLSL» |
|
|
Jurec
348 EGP
   Рейтинг канала: 4(76) Репутация: 102 Сообщения: 1441 Заблокирован Откуда: Seattle Зарегистрирован: 25.02.2006
 |
|
Анимация есть? Типа что волной расходиться и затухает постепенно?
+ для каждого попадания - надо рисовать свою сферу?
_________________ MOV topka, C++ |
|
|
~DJ~
640 EGP
  Рейтинг канала: 5(115) Репутация: 143 Сообщения: 1218 Откуда: Тёмный город на Неве Зарегистрирован: 25.01.2006
 |
|
Зачем свою? Все на одной.
_________________ Весна пришла откуда не ждали |
|
|
DIMOSUS.X
997 EGP
        Рейтинг канала: 4(67) Репутация: 188 Сообщения: 3252 Откуда: Vilnius/Minsk Зарегистрирован: 06.08.2008
 |
|
Анимация есть - в шейдер передаются переменные, указывающие на текущее состояние каждого поподания. Сначала появляется небольшое пятно, набирает яркость и начинает переходить в кольца, после чего плавно затухает. Также скролится текстура преломлений.
Сфера одна, делал на третьих шейдерах - число команд для обработки пяти поподаний ~150. В Rendermonkey фпс больше 2к.
Шейдер разбит на два - один отрисовывает цвет, второй карту нормалей, для расчета преломлений.
_________________ Даже ежики ежиков могут с трудом,
Иначе бы ежики были кругом.
Последний раз редактировалось: DIMOSUS.X (23:43 15-06-2010), всего редактировалось 1 раз |
|
|
Jurec
348 EGP
   Рейтинг канала: 4(76) Репутация: 102 Сообщения: 1441 Заблокирован Откуда: Seattle Зарегистрирован: 25.02.2006
 |
|
понял
на каждые 5 попаданий - своя сфера?
_________________ MOV topka, C++ |
|
|
DIMOSUS.X
997 EGP
        Рейтинг канала: 4(67) Репутация: 188 Сообщения: 3252 Откуда: Vilnius/Minsk Зарегистрирован: 06.08.2008
 |
|
Повторяю - сфера одна и отрисовывается в один проход
_________________ Даже ежики ежиков могут с трудом,
Иначе бы ежики были кругом. |
|
|
Jurec
348 EGP
   Рейтинг канала: 4(76) Репутация: 102 Сообщения: 1441 Заблокирован Откуда: Seattle Зарегистрирован: 25.02.2006
 |
|
т.е. там передача массива uniform`ов (или как там оно называется в HLSL) а потом просто циклом обрабатывается? такой себе 3.0 шейдер?
_________________ MOV topka, C++ |
|
|
DIMOSUS.X
997 EGP
        Рейтинг канала: 4(67) Репутация: 188 Сообщения: 3252 Откуда: Vilnius/Minsk Зарегистрирован: 06.08.2008
 |
|
какие массивы? какие циклы?
Зачем городить огород? Шейдер почти линейный (только оптимизации if 'ами)
добавлено спустя 6 минут:
http://ipicture.ru/uploads/100616/iYO3LaLQ5V.jpg
это на фоне
_________________ Даже ежики ежиков могут с трудом,
Иначе бы ежики были кругом.
Последний раз редактировалось: DIMOSUS.X (00:01 16-06-2010), всего редактировалось 1 раз |
|
|
Варсик
545 EGP
    Рейтинг канала: 4(81) Репутация: 117 Сообщения: 4041 Откуда: Москва Зарегистрирован: 22.12.2002
 |
|
Стоп... У мебя максимум 5 попаданий одновременно может отрисоваться, так?
_________________ WARNING: By reading this post you accept that this post is genius. |
|
|
DIMOSUS.X
997 EGP
        Рейтинг канала: 4(67) Репутация: 188 Сообщения: 3252 Откуда: Vilnius/Minsk Зарегистрирован: 06.08.2008
 |
|
Да, решил остановиться на пяти. Так как щит немонолитный, а разбит на секции, у больших кораблей количество одновременно отрисовываемых поподаний будет от 20 и выше.
_________________ Даже ежики ежиков могут с трудом,
Иначе бы ежики были кругом. |
|
|
Jurec
348 EGP
   Рейтинг канала: 4(76) Репутация: 102 Сообщения: 1441 Заблокирован Откуда: Seattle Зарегистрирован: 25.02.2006
 |
|
DIMOSUS.X : |
Да, решил остановиться на пяти.
|
Вот теперь всё стало ясно. Надо мне научиться правильно вопросы задавать
DIMOSUS.X : |
у больших кораблей количество одновременно отрисовываемых поподаний будет от 20 и выше
|
Если сделаешь это опять же этими if`ами - убъешь производительность. Тут надо похитрее как-то.
_________________ MOV topka, C++ |
|
|
DIMOSUS.X
997 EGP
        Рейтинг канала: 4(67) Репутация: 188 Сообщения: 3252 Откуда: Vilnius/Minsk Зарегистрирован: 06.08.2008
 |
|
Не понял, почему убъю? Ифы просто отсекают лишние вычисленя, в случае отсутствия поподаний. Пяток ифов в одном шейдере фпс не снизят - проверено.
добавлено спустя 6 минут:
Я вот сейчас задумался о SSAO - реализовать его вполне по силам, но вот нужен ли он в комосе?
_________________ Даже ежики ежиков могут с трудом,
Иначе бы ежики были кругом.
Последний раз редактировалось: DIMOSUS.X (09:42 16-06-2010), всего редактировалось 1 раз |
|
|
Guest
2075 EGP
              Рейтинг канала: 5(167) Репутация: 376 Сообщения: 27975 Откуда: Моск. Зарегистрирован: 12.10.2004
 |
|
A почему не сделать мультипроходный вариант, со сложением результата? Никаких ветвлений, количество попаданий не ограничено...
_________________ Трещит земля как пустой орех
Как щепка трещит броня |
|
|
DIMOSUS.X
997 EGP
        Рейтинг канала: 4(67) Репутация: 188 Сообщения: 3252 Откуда: Vilnius/Minsk Зарегистрирован: 06.08.2008
 |
|
не хотел заморачиваться - сделал в лоб
Немного переделал
_________________ Даже ежики ежиков могут с трудом,
Иначе бы ежики были кругом. |
|
|
Magistr_AVSH
605 EGP
     Рейтинг канала: 2(16) Репутация: 119 Сообщения: 2705 Откуда: Росс 154 - планета Мерлин. Зарегистрирован: 26.12.2009
 |
|
Надо что бы много разных было, для разных щитов, так что...
_________________ Добрый и сытый кот. |
|
|
Guest
2075 EGP
              Рейтинг канала: 5(167) Репутация: 376 Сообщения: 27975 Откуда: Моск. Зарегистрирован: 12.10.2004
 |
|
DIMOSUS.X : |
Еще немного выноса мозга, и добавил преломление
для реализации пришлось задействовать 7 отдельных шейдеров...
|
А я с преломлением один раз заморочился, понял принцип действия, но до реализации тогда руки не дошли Предполагалось делать рендер всего непрозрачного в один проход, плюс маска дальности, затем во втором проходе рендерить искажение в нормалмапу для преломляющей геометрии с отрезкой лишних частей по маске из первого шага, ну и потом уже по сути пост-эффектом (потому что screen-space, чистое 2d на одном кваде) давать искажение. Т.е. 3-4 шейдера, 2 техники.
Сейчас я те выкладки не могу уже вспомнить полностью.
Расскажи, как ты сделал?
_________________ Трещит земля как пустой орех
Как щепка трещит броня |
|
|
DIMOSUS.X
997 EGP
        Рейтинг канала: 4(67) Репутация: 188 Сообщения: 3252 Откуда: Vilnius/Minsk Зарегистрирован: 06.08.2008
 |
|
Как обычно в лоб.
Первый рендер общий диффуз (преломляющие объекты не рендерятся) в буффер R8G8B8
Второй - диффус в HDR16 текстуру, в два раза меньшего разрешения (блюму больше и не нужно)
Третий проход - в R8G8B8 рендерятся преломляющие оъекты, при этом на них натягивается текстура нормалей, а фон устанавливается цветом 0.5f, 0.5f, 1.0f. Разрешение также в два раза меньше разрешения экрана - получается приятная легкая замыленность преломлений.
Далее идет трех этапная обработка блюма (отсечение, размытие по х, размытие по y)
И на конец на квад финальный шейдер выводит картинку, полученную искажением первого буфера по полученной карте нормалей с последующим наложением блюма.
добавлено спустя 11 минут:
Кстати - решил заюзать Z-buffer для отсечения по дальности видимости.
Принцип таков - рендерим бэкграунд и планеты.
Рендерим все остальные объекты с маской в альфа канале.
Далее по данным из буффера глубины и учетом маски накладываем второй проход на первый.
Я ничего не упустил?
добавлено спустя 12 минут:
Или не заморачиваться и добавить в шейдеры станций и кораблей параметр прозрачность?
_________________ Даже ежики ежиков могут с трудом,
Иначе бы ежики были кругом.
Последний раз редактировалось: DIMOSUS.X (22:56 18-06-2010), всего редактировалось 2 раз(а) |
|
|
Guest
2075 EGP
              Рейтинг канала: 5(167) Репутация: 376 Сообщения: 27975 Откуда: Моск. Зарегистрирован: 12.10.2004
 |
|
DIMOSUS.X : |
Кстати - решил заюзать Z-buffer для отсечения по дальности видимости.
Принцип таков - рендерим бэкграунд и планеты.
Рендерим все остальные объекты с маской в альфа канале.
Далее по данным из буффера глубины и учетом маски накладываем второй проход на первый.
Я ничего не упустил?
|
Эм... А зачем, никак не догоняю?
Вырубил Z-буферизацию.
Отрендерил фон. Гут.
Врубил буферизацию (или не врубил - смотря какая геометрия у планет).
Отрендерил планеты суммой по альфе
SrcBlend = One;
DestBlend = Zero; Гут.
Отрендерил геометрию в том же режиме. Что заслонено - будет вынуто из рендера ранним z-отсечением на аппаратном уровне. Что сверху - будет сверху нарисовано. Где ничего нет - будет просвечивать буфер.
Зачем дополнительная операция тестирования по маске, если всё это аппаратно можно сделать?
DIMOSUS.X : |
Как обычно в лоб.
Первый рендер общий диффуз (преломляющие объекты не рендерятся) в буффер R8G8B8
Второй - диффус в HDR16 текстуру, в два раза меньшего разрешения (блюму больше и не нужно)
Третий проход - в R8G8B8 рендерятся преломляющие оъекты, при этом на них натягивается текстура нормалей, а фон устанавливается цветом 0.5f, 0.5f, 1.0f. Разрешение также в два раза меньше разрешения экрана - получается приятная легкая замыленность преломлений.
|
А что дешевле - делать два раза просчёт геометрии или ещё один шаг понижения разрешения 2x2?
Я в паре с Калемом делал сразу рендер картинки в полноразмерную текстуру HDR16, оттуда уже отсечение и даунсэмплинг под блюм, т.е. геометрический проход только один, потом работа с квадом. Проблема была только с FSAA, да и то - если невнимательно читать директиксовый мануал (надо менять формат буфера глубины вовремя).
Во, а нормалку преломления интересно, у меня по-другому было, спасибо за полезный типс
добавлено спустя 1 минуту:
DIMOSUS.X : |
Или не заморачиваться и добавить в шейдеры станций и кораблей параметр прозрачность?
|
Там с некоторыми моделями начинается жестокий хардкор, если просто по альфе блендить. Если даже тестирование по z включено и задняя сторона модели не лезет поверх передней - всё равно могут быть видны "кишки" отдельных модулей корабля сквозь другие.
_________________ Трещит земля как пустой орех
Как щепка трещит броня
Последний раз редактировалось: Guest (23:47 18-06-2010), всего редактировалось 1 раз |
|
|
DIMOSUS.X
997 EGP
        Рейтинг канала: 4(67) Репутация: 188 Сообщения: 3252 Откуда: Vilnius/Minsk Зарегистрирован: 06.08.2008
 |
|
Guest : |
Эм... А зачем, никак не догоняю?
Вырубил Z-буферизацию.
Отрендерил фон. Гут.
Врубил буферизацию (или не врубил - смотря какая геометрия у планет).
Отрендерил планеты суммой по альфе
SrcBlend = One;
DestBlend = Zero; Гут.
|
Видимо я тот еще ламер - так как ни фига не понял...
Guest : |
А что дешевле - делать два раза просчёт геометрии или ещё один шаг понижения разрешения 2x2?
|
в соответствии с моими замерами, рендер R8G8B8 + HDR16/2х2 обходится дешевле полноэкранного HDR16
_________________ Даже ежики ежиков могут с трудом,
Иначе бы ежики были кругом. |
|
|
Guest
2075 EGP
              Рейтинг канала: 5(167) Репутация: 376 Сообщения: 27975 Откуда: Моск. Зарегистрирован: 12.10.2004
 |
|
DIMOSUS.X : |
Видимо я тот еще ламер - так как ни фига не понял...
|
Нет, это я так объяснил. Сорри, быль пъян.
В общем, есть такая штука - альфаблендинг.
Почитать можно примерно отсюда: http://msdn.microsoft.com/en-us/library/bb172255(v=VS.85).aspx
Хотя в доках самого DirectX SDK более вменяемые статьи.
Принцип - сложение по формуле (для каждого пикселя):
Код: |
Color = TexelColor x SourceBlend + CurrentPixelColor x DestBlend
т.е.
Цвет_после_прохода = цвет_рендера*формула_source + цвет_буфера_кадра*формула_destination |
По умолчанию SourceBlend = one, DestBlend = zero, то есть цвет буфера полностью замещается тем, что нафигачит шейдер пайплайн, в тех местах, где он что-то нафигачит, т.е. где есть геометрия. В случае экранного квада, понятное дело, геометрия будет по всему экрану.
Но там есть гораздо более интересные формулы, ставящие смешивание в зависимость от альфы и/или цвета исходных пикселей и текселей. Правда, нужно не забывать, что главным действием всё же является сложение, так что при наложении по альфе (как раз полупрозрачность поверх фона) нужно для DestBlend ставить не zero, а invsrcalpha.
Впрочем, в статье написано абсолютно то же самое.
Этот же механизм доступен и в техниках эффектов шейдеров, каждому проходу (pass) можно ставить флаги, аналогичные таковым в интерфейсе устройства на С++.
На сях все эти флаги описаны тут: http://msdn.microsoft.com/en-us/library/bb172599(VS.85).aspx для каждого есть таблицы присваеваемых значений.
Для шейдера же хрен этих флагов в документации найдёшь, только в примерах.
Но тем не менее, их можно вписывать, отпилив предварительно префикс D3DRS_
То есть получается, например, так:
Код: |
technique back_shader {
pass one {
ZENABLE = True;
ZWriteEnable = False;
alphatestenable = True;
SrcBlend = one;
DestBlend = Zero;
CULLMODE = ccw;
ZFUNC = LESS;
ALPHABLENDenable = TRUE;
PixelShader = ps;
VertexShader = vs;
}
} |
Регистр пофиг, хотя лучше писать в одном стиле .
добавлено спустя 2 минуты:
DIMOSUS.X : |
в соответствии с моими замерами, рендер R8G8B8 + HDR16/2х2 обходится дешевле полноэкранного HDR16
|
Да, уже почитал техники оптимизации, рекомендуют на пиксельные шейдеры не налегать - они вызываются гораздо чаще, ибо пикселей чувствительно больше вертексов, и напрягают карту. Если можно обойтись меньшим разрешением или вообще всё на вертексах посчитать - лучше так и сделать.
Правда, на вертексах многое считать угловато...
_________________ Трещит земля как пустой орех
Как щепка трещит броня
Последний раз редактировалось: Guest (13:38 19-06-2010), всего редактировалось 4 раз(а) |
|
|
DIMOSUS.X
997 EGP
        Рейтинг канала: 4(67) Репутация: 188 Сообщения: 3252 Откуда: Vilnius/Minsk Зарегистрирован: 06.08.2008
 |
|
А получится сделать так, что бы большие обьекты с ростом расстояния исчезали не сразу, а постепенно? В смысле дальняя половина объекта уже полностью прозрачна, а ближняя еще нет?
_________________ Даже ежики ежиков могут с трудом,
Иначе бы ежики были кругом.
Последний раз редактировалось: DIMOSUS.X (15:29 19-06-2010), всего редактировалось 1 раз |
|
|
|
|
|
Канал Игры Мечты: «HLSL» |
|