HLFX.Ru Forum
профиль •  правила •  регистрация •  календарь •  народ •  FAQ •  поиск •  новое •  сутки •  главная •  выход  
HLFX.Ru Forum HLFX.Ru Forum > Теория и практика > OpenGL > Возведение в степень в шейдерах 1.х
для реализации модели бликового (specular) освещения
  Предыдущая тема   Следующая тема
Автор
Тема Новая тема    Ответить
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34527
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


Возведение в степень в шейдерах 1.х

В этой небольшой статье я расскажу о некоторых способах возведения в высокую степень в шейдерных моделях, не поддерживающих эту функцию напрямую. Речь идет о шейдерах версии 1.х. Начиная с версии 2.0 (и тем более в GLSL) функция pow стала библиотечной, и никаких проблем наблюдаться не будет. Но как быть, если мы хотим, чтобы наш движок выдавал похожую картинку на разных шейдерных моделях? Если вас не заботит поддержка видеокарт ниже GeForce 6xxx и Radeon 9500, дальше можете не читать.
А если вам все же хочется, чтобы хоть какой-то минимум спецэффектов работал на таких видеокартах, как Radeon 9200 и GeForce 3? И если вы хотите видеть удовлетворительную производительность на карточках GeForce FX, на которых шейдеры 2.0 хоть и поддерживаются, но работают несравненно медленнее, чем 1.х? Тогда стоит задуматься о правильном выборе модели бликового освещения. В частности, о степени, в которую будете возводить (N.H).
Конечно, можно использовать высокую степень на шейдерной модели 2.0 и выше, и низкую – на 1.х. Однако минус такого подхода очевиден – картинка сильно различается, и тем сильнее, чем ниже значение степени. Посмотрим, в какую степень все же можно возвести в шейдерах 1.х без особых затрат.
Первое, что приходит на ум – последовательное возведение (т.н. successive squaring). Мы получаем значение (N.H), умножаем само на себя, потом еще раз само на себя, и т.д. Правило, которым мы руководствуемся, известно из школьного курса алгебры: «при перемножении степеней с одинаковыми основаниями показатели степеней складываются».
Довольно легко реализовать возведение в 8 степень, используя Register Combiners.

C++ Source Code:
1
!!RC1.0
2
//General combiner 1
3
//RGB: spare0 = N.H
4
{
5
  rgb {
6
    spare0 = expand(tex0) . expand(tex1);
7
  }
8
}
9
//General combiner 1
10
//RGB: spare0 = saturate(N.H)^2
11
{
12
  rgb {
13
    spare0 = unsigned(spare0) * unsigned(spare0);
14
  }
15
}
16
//Final combiner
17
//RGB: out = saturate(N.H)^8
18
final_product = spare0 * spare0;
19
out.rgb = final_product * final_product;
20
out.a = unsigned_invert(zero);


Оставшиеся блоки можно использовать под другие нужды освещения (наложение текстуры, фонового освещения, диффузного освещения и т.д.). Однако обратите внимание – мы использовали финальный комбайнер для возведения в квадрат дважды. На практике – в нем нужно сделать как минимум еще одно умножение и, возможно, сложение. Тогда для возведения потребуется еще один или два блока General Combiner. А если мы хотим возвести в 16 степень – то всего потребуется не менее 5 блоков. Не очень удобно, а главное – не очень быстро.
На шейдерах 1.4 для Radeon (ATI_fragment_shader) возведение в 8 и 16 степень делается проще, т.к. в одном проходе шейдера разрешается делать 8 инструкций, и в принципе можно возводить даже в более высокие степени (например, 32). Более того, второй проход шейдера позволяет организовать обращение к текстуре, в которую закодирована функция любой степени (разумеется, точность 8-битная). А вот на GeForce3 Texture Shader такая возможность есть только на бумаге – на практике шейдер GL_DOT_PRODUCT_TEXTURE_2D_NV не позволяет ренормализовать вектор half-angle, а без этого результат может давать огромную ошибку. Да, шейдерная модель 1.х от NVidia кастрированная, это нужно признать, и больше всего проблем возникает именно с ней…
К счастью, существуют формулы приближенного вычисления степени 8 и 16, которые хорошо ложатся на механизм Register Combiners. Вот эти формулы:

  1. saturate(4*((N.H)-0.75))
  2. saturate(4*((N.H)^2-0.75))
  3. (saturate(2*((N.H)-0.5)))^4

Первая формула требует всего один General Combiner:

C++ Source Code:
1
!!RC1.0
2
const0 = ( 0.75, 0.75, 0.75, 0.75 );
3
{
4
  rgb {
5
    discard = expand(tex0) . expand(tex1);
6
    discard = unsigned_invert(zero) * -const0;
7
    spare0 = sum();
8
    scale_by_four();
9
  }
10
}


Вторая – чуть сложнее, и потребует два General Combiner:

C++ Source Code:
1
!!RC1.0
2
const0 = ( 0.75, 0.75, 0.75, 0.75 );
3
{
4
  rgb {
5
    spare0  = expand(tex0) . expand(tex1);
6
  }
7
}
8
{
9
  rgb {
10
    discard = unsigned(spare0) * unsigned(spare0);
11
    discard = unsigned_invert(zero) * -const0;
12
    spare0 = sum();
13
    scale_by_four();
14
  }
15
}


Последняя формула – самое лучшее приближенное вычисление 16 степени, однако потребуется возвести всего лишь в 4-ю методом successive squaring.
C++ Source Code:
1
!!RC1.0
2
{
3
  rgb {
4
    spare0  = expand(tex0) . expand(tex1);
5
  }
6
}
7
{
8
  rgb {
9
    spare0  = unsigned(spare0) * unsigned(spare0);
10
    bias_by_negative_one_half_scale_by_two();
11
  }
12
}
13
{
14
  rgb {
15
    spare0  = unsigned(spare0) * unsigned(spare0);
16
  }
17
}
18
{
19
  rgb {
20
    spare0  = unsigned(spare0) * unsigned(spare0);
21
  }
22
}

Последнее возведение можно сделать в Final Combiner (используя final_product), и тогда приближенное возведение в 16 степень будет стоить вам три General Combiner, где еще остается место для других вычислений.
Какую формулу выбрать? Все зависит от того, какие ограничения накладывает на вас используемая модель освещения. На мой взгляд, оптимальна последняя формула. Она так же легко реализуется по механизму ATI_fragment_shader за один проход (всего 3 инструкции, главное не забывать про модификаторы 2X_BIT, BIAS_BIT и т.п.).
А для наглядности – привожу график функций в сравнении с обычными степенными.



Шейдеры 1.4 для Радеонов я не привожу, но писать их еще легче, чем Register Combiners, особенно если воспользоваться моей библиотекой AFSparse для чтения и обработки ассемблероподобного кода.
Статью я написал потому, что не нашел в Интернете ничего подобного тогда, когда мне это понадобилось. Теперь такая статья есть.
И напоследок: помните, что системные требования ваших движков должны соответствовать выдаваемой картинке. И если эту картинку можно нарисовать на шейдерах 1.х, то сделайте это.

__________________

Сообщить модератору | | IP: Записан
Сообщение: 43476

Старое сообщение 18-03-2009 17:46
-
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32213
Нанёс повреждений: 392 ед.

Рейтинг



Цитата:
И если эту картинку можно нарисовать на шейдерах 1.х, то сделайте это.

Уж лучше вообще без шейдеров, если это будет быстрее на старых карточках.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 43484

Старое сообщение 18-03-2009 21:43
-
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34527
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


Без шейдеров быстрее скорее всего не будет. Та же попикселка на ГеФорс2 (без шейдеров) требует 4-5 проходов на источник света, а на гефорс3 - всего 2. На R200 и выше - все укладывается в один проход (т.к. 6 текстурных блоков).

Добавлено 19-03-2009 в 05:15:

Для R100, кстати (где только env_dot3, но нет ничего подобного register combiners) тенебра делает 9 проходов. Из них 4 - для расчета спекуляра и возведения его в 8 степень.
Хотя конечно, польза от попикселки на таких видеокартах весьма сомнительна...

__________________

Сообщить модератору | | IP: Записан
Сообщение: 43485

Старое сообщение 18-03-2009 23:15
-
FiEctro
Кот Арсис

Дата регистрации: Aug 2006
Проживает: код
Сообщений: 12901
Возраст: 32

Рейтинг



XaeroX
Молодец. Тока я до этого еще не дорос.
З.Ы. не хочется разводить демагогию, но всётаки зачем досих пор нужна поддержка всяких ГыФорс2 , рива, вуду и т.п. ? Сколько я видал комп. аудиторий, и там минимум стоит GF4, тока толку ? Без ГЛ всеравно ничего не попрёт. Непонимаю зачем такие ацкие оптимизации, когда уже о этих видеокартах давным давно забыли.

__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!

Сообщить модератору | | IP: Записан
Сообщение: 43501

Старое сообщение 19-03-2009 14:09
- За что?
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32213
Нанёс повреждений: 392 ед.

Рейтинг



Цитата:
но всётаки зачем досих пор нужна поддержка всяких ГыФорс2 , рива, вуду и т.п.

Сделать игру, которая запускается на GF9800GTX и жрет всю доступную оперативку очень легко. А вот сделать отличную картинку на GeForce2, ничуть не уступающую картинке более мощной карточки - это признак настоящего Мастера.
Равно как и отсутствие за приложением километровых хвостов, в виде каких-то драйверов, сторонних дллок (исключение - плагины), какой-нибудь строго определенной версии DirectX и общего веса исполняемого кода over 30 мегабайт.
повторюсь еще раз - насвинячить и потом отмазаться, что у вас мол видеокарта слабая - очень легко.
А статьи Ксерокса, они как раз и предназначены освещать темы, о которых все предпочитают молчать.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 43502

Старое сообщение 19-03-2009 14:33
-
FiEctro
Кот Арсис

Дата регистрации: Aug 2006
Проживает: код
Сообщений: 12901
Возраст: 32

Рейтинг



>> приложением километровых хвостов, в виде каких-то драйверов, сторонних дллок

GL тоже драйвер. Т.е. судя из всего вышесказаного, вы просто оттачиваете своё мастерство?

__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!

Сообщить модератору | | IP: Записан
Сообщение: 43504

Старое сообщение 19-03-2009 14:47
- За что?
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34527
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


FiEctro
Так речь тут о гефорс2 и гефорс4мх и не идет.
Минимум гефорс3.

__________________

Сообщить модератору | | IP: Записан
Сообщение: 43505

Старое сообщение 19-03-2009 14:58
-
Тема: (Опционально)
Ваш ответ:



Переводчик транслита


[проверить длину сообщения]
Опции: Автоматическое формирование ссылок: автоматически добавлять [url] и [/url] вокруг интернет адресов.
Уведомление по E-Mail: отправить вам уведомление, если кто-то ответил в тему (только для зарегистрированных пользователей).
Отключить смайлики в сообщении: не преобразовывать текстовые смайлики в картинки.
Показать подпись: добавить вашу подпись в конец сообщения (только зарегистрированные пользователи могут иметь подписи).

Временная зона GMT. Текущее время 21:34. Новая тема    Ответить
  Предыдущая тема   Следующая тема
HLFX.Ru Forum HLFX.Ru Forum > Теория и практика > OpenGL > Возведение в степень в шейдерах 1.х
для реализации модели бликового (specular) освещения
Версия для печати | Отправить тему по E-Mail | Подписаться на эту тему

Быстрый переход:
Оцените эту тему:

Правила Форума:
Вы not можете создавать новые темы
Вы not можете отвечать в темы
Вы not можете прикреплять вложения
Вы not можете редактировать ваши сообщения
HTML Код ВЫКЛ
vB Код ВКЛ
Смайлики ВКЛ
[IMG] Код ВКЛ
 

< Обратная связь - HLFX.ru >

На основе vBulletin
Авторское право © 2000 - 2002, Jelsoft Enterprises Limited.
Дизайн и программирование: Crystice Softworks © 2005 - 2024