ZXNet эхоконференция «code.zx»


тема: Реализация Phong shading'a на Speccy



от: Aleksey Malov
кому: All
дата: 22 Apr 2000
Приветствую тебя, All!

Освещение по Фонгу (в дальнейшем PS) - весьма часто встречающийся в демах на
PC и Amiga вид освещения. 3d объекты с PS выглядят значительно симпатичнее,
чем с Gouraud Shading'ом.
PS можн встретить и в нескольких спектрумовских демах 1999-2000 гг. - Napalm
by Eternity Industry, Bobering by Syndrome, Voodoo by Scene. Скорость
реализации PS во всех этих демах довольно небольшая (порядка 2-3 fps). То ли
руки кривые, то ли 3.5 MHz сказываются. Однако у вас есть возможность сделать
быстрее, чем у этих монстров демомейкинга. Самый простой способ - ускорить
перекидывание chunk'ов на экран (во всех этих демах применяется 101 тактновый
inner loop, a не предложенныйй мною 70-82 тактовый). Однако это позволит от
силы сэкономить 25-35 тысяч тактов на фрейм. Остается лишь ускорить внутренний
цикл самого освещения. Итак, начнем.

При освещении по Фонгу делаются следующие предположения:
1. Источник света бесконечно удален => освещение происходит параллельным пучком
лучей
2. Поверхность не отражает свет, а только рассеивает.
3. При интерполяции нормали от вершины к вершине длина нормали HЕ МЕHЯЕТСЯ (это
не сильно сказывается если полигоны описывают довольно гладкую поверхность
тела).
Учитывая это, освещение можно свести к обычному наложению текстуры, в
качестве которой выступает таблица, рассчитанная по след. формуле (Текстура
имеет размер 64*64):
a(y,x)=amp*(sin (y*pi/64) * sin (x*pi/64))^4.
amp=яркость источника

Однако, лучше хранить тектуру 256*64, т.е. в оставшихся 3/4 ширины текстуры
можно разместить текстуры для заднего плана, для полигонов и т.п.
Рассчитать данную текстуру на ассембблере несложно. Возводить в 4 степень
можно при помощи таблицы.

Поскольку полигоны, из которых состоит объект, описывают какую-то кривую
поверхность, то нормали к вершинам полигонов следует рассчитывать так:
1. производим векторное сложение нормалей к полигонам, которые имеют общую
вершину.
2. затем приводим полученный вектор к длине 32 (поскольку текстура у нас
64*64):

n=число полигонов, имеющих данную вершину
─ ----- ─
N= Ni
/ ────────*32
----- n
i=1

Это нужно для того, чтобы все нормали к вершинам были одной длины.
Координаты каждой вершины полигона в текстуре рассчитываются по формуле:

u=32+Nx
v=32+Ny

Hу и остается вывести заполененный текстурой полигон в чанковый буффер.
inner loop:

ld a,h
add hl,de
exx
ld b,a
ld c,h
add hl,de
ld a,(bc)
exx
ld (bc),a
inc c

;hl-v (8.8 fixed point)
;de-dv (8.8 fixed point)
;hl'-u (8.8 fixed point)
;de'-du (8.8 fixed point)

По странному недоразумению копирайт на данный inner loop присвоил себе
Wolf/Scene. Хотя он практически не отличается от придуманного в 1995 году inner
loop'a BUSY Soft'a в части Rotate Zoomer Echology megademo.

Если кому что не понятно или хочется узнать поподробнее, спросите у кого нибудь
FAQ эхи Demo.Design.

Hу а мое личное мнение по поводу всех этих Phong Shading'ов на спектруме с
черепашьей скоростью (2-3 fps) - Hе можешь спать - не мучай жору.
Hу не для Спектрума всё это! Демо должно быть шустрым, а не следовать
принципу батареййки Energizer - HИЧТО HЕ РАБОТТАЕТ ТАК ДОЛГО.

Желаю вам здоровья, счастья и творческих узбеков.
Aleksey Malov aka VIVID/Brainwave.




Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Платный сервер - О преимуществах и недостатках платных BBS.
Реклама - реклама и объявления.
Ликбез - полный дизассемблер ПЗУ (часть 21).
Экспертиза - прохождение фентезийной ролевой игры в двух частях "Hero Quest" с отгрузкой на диск.
Описание - карты и прохождение игры BLOODWYCH.

В этот день...   26 апреля