Silnik zagłady - Doom engine

ID Tech 1
Deweloper(zy) id Software , (John Carmack, John Romero, Dave Taylor)
Wersja ostateczna
1,9 / 1 lutego 1995 ; 26 lat temu ( 01.02.1995 )
Magazyn github.com/id-Software/DOOM
Napisane w C , język asemblera
Platforma DOS , Microsoft Windows , MacOS , Linux , Android , Amiga Workbench , NeXTSTEP , Macintosh , Commodore Amiga , NeXT , SNES , Atari Jaguar , Sega 32X , Sony PlayStation , Panasonic 3DO , Nintendo 64 , Sega Saturn , Game Boy Advance , Nintendo Switch
Następca Silnik Quake
Licencja GNU GPL-2.0-lub-później
3DO : MIT
SNES : Tylko GPL-3.0

id Tech 1 , znany również jako silnik Doom , to silnik gry, który napędza gry id Software Doom i Doom II: Hell on Earth . Jest również używany w Heretic , Hexen: Beyond Heretic , Strife: Quest for the Sigil , Hacx: Twitch 'n Kill , Freedoom i innych grach produkowanych przez licencjobiorców. Został stworzony przez Johna Carmacka , a funkcje pomocnicze napisali Mike Abrash , John Romero , Dave Taylor i Paul Radek. Pierwotnie opracowany na komputerach NeXT , został przeniesiony do systemu DOS w pierwszym wydaniu Dooma , a później został przeniesiony na kilka konsol do gier i systemów operacyjnych .

Kod źródłowy do Linuksa wersji Doom został zwolniony do publicznej wiadomości na podstawie licencji udzielonej że prawa do użytku niekomercyjnego w dniu 23 grudnia 1997 roku, a następnie w wersji linuksowej Doom II około tydzień później w dniu 29 grudnia 1997 roku kod źródłowy został później ponownie wydany na licencji GNU General Public License v2.0 lub nowszej, 3 października 1999 r. Dziesiątki nieoficjalnych portów źródłowych Dooma , które zostały utworzone od tego czasu, pozwalają Doomowi działać na wcześniej nieobsługiwanych systemach operacyjnych, a czasem radykalnie rozszerzać funkcjonalność silnika z nowymi funkcjami.

Chociaż silnik renderuje przestrzeń 3D, ta przestrzeń jest rzutowana z dwuwymiarowego rzutu kondygnacji . Linia wzroku jest zawsze równoległa do podłogi, ściany muszą być prostopadłe do podłóg i nie jest możliwe tworzenie wielopoziomowych konstrukcji lub obszarów nachylonych (podłogi i sufity pod różnymi kątami). Pomimo tych ograniczeń silnik stanowił technologiczny skok w porównaniu z poprzednim silnikiem Wolfenstein 3D firmy id . Silnik Dooma został później przemianowany na „id Tech 1”, aby sklasyfikować go na długiej liście silników gier firmy id Software .

Swiat gry

Silnik Dooma oddziela renderowanie od reszty gry. Silnik graficzny działa tak szybko, jak to możliwe, ale świat gry działa z prędkością 35 klatek na sekundę niezależnie od sprzętu, więc wielu graczy może grać przeciwko sobie na komputerach o różnej wydajności.

Struktura poziomu

Prosta konfiguracja pokazująca, jak Doom wewnętrznie reprezentuje poziomy

Widok mapy w edytorze

Patrząc z góry na dół, wszystkie poziomy Dooma są w rzeczywistości dwuwymiarowe, co pokazuje jedno z kluczowych ograniczeń silnika Dooma : nie jest możliwe przejście typu „room over room” . To ograniczenie ma jednak pozytywną stronę: można łatwo wyświetlić „tryb mapy”, który przedstawia ściany i pozycję gracza, podobnie jak pierwszy obrazek po prawej stronie.

Obiekty podstawowe

Jednostką podstawową jest wierzchołek , który reprezentuje pojedynczy punkt 2D. Wierzchołki (lub „wierzchołki”, jak są one określane wewnętrznie) są następnie łączone w linie , znane jako „linedefs”. Każdy linedef może mieć jedną lub dwie strony, znane jako "sidedefs". Definicje boczne są następnie grupowane razem, tworząc wielokąty ; są to tak zwane „sektory”. Sektory reprezentują poszczególne obszary poziomu.

Sektory

Każdy sektor zawiera szereg właściwości: wysokość podłogi, wysokość sufitu, poziom światła, teksturę podłogi i teksturę sufitu. Aby na przykład mieć inny poziom światła w określonym obszarze, należy utworzyć nowy sektor dla tego obszaru z innym poziomem światła. Jednostronne definicje linii reprezentują zatem solidne ściany, podczas gdy dwustronne linie reprezentują linie mostów między sektorami.

Sidedefs

Definicje boczne służą do przechowywania tekstur ścian ; są one całkowicie oddzielone od tekstur podłogi i sufitu. Każdy sidedef może mieć trzy tekstury; są to tak zwane tekstury środkowa, górna i dolna. W jednostronnych formatach liniowych jako teksturę na ścianie używana jest tylko tekstura środkowa. W przypadku linii dwustronnych sytuacja jest bardziej złożona. Dolna i górna tekstura służą do wypełniania luk, w których sąsiednie sektory mają różne wysokości podłogi i sufitu: na przykład dolne tekstury są używane do stopni. Definicje boczne również mogą mieć teksturę środkową, chociaż większość nie; służy do zawieszania tekstur w powietrzu. Na przykład, gdy widoczna jest przezroczysta tekstura paska tworząca klatkę, jest to przykład środkowej tekstury na dwustronnym def.

Partycjonowanie przestrzeni binarnej

Doom wykorzystuje system znany jako binarne partycjonowanie przestrzeni (BSP). Narzędzie służy do wcześniejszego generowania danych BSP dla poziomu. Ten proces może zająć trochę czasu na dużym poziomie. Z tego powodu nie można przesuwać ścian w Doomie ; podczas gdy drzwi i windy poruszają się w górę iw dół, żadne z nich nigdy nie porusza się na boki.

Poziom jest podzielony na drzewo binarne : każda lokalizacja w drzewie jest „węzłem”, który reprezentuje określony obszar poziomu (z węzłem głównym reprezentującym cały poziom). Na każdej gałęzi drzewa znajduje się linia podziału, która dzieli obszar węzła na dwa podwęzły. W tym samym czasie linia podziału dzieli linedefs na odcinki zwane "segs".

Przy liściach drzewa znajdują się wypukłe wielokąty , gdzie nie jest potrzebny dalszy podział poziomu. Te wypukłe wielokąty są określane jako podsektory (lub „SSECTORS”) i są powiązane z określonym sektorem. Każdy podsektor ma powiązaną z nim listę segmentów.

System BSP sortuje podsektory we właściwej kolejności do renderowania. Algorytm jest dość prosty:

  1. Zacznij od węzła głównego.
  2. Narysuj rekurencyjnie węzły podrzędne tego węzła. Węzeł potomny znajdujący się najbliżej kamery jest rysowany jako pierwszy przy użyciu algorytmu Scanline . Można to znaleźć patrząc na to, po której stronie linii podziału węzła znajduje się kamera.
  3. Po osiągnięciu podsektora narysuj go.

Proces jest zakończony, gdy cała kolumna pikseli jest wypełniona (tzn. nie ma już żadnych przerw). Taka kolejność zapewnia, że ​​nie zostanie wykorzystany czas na rysowanie obiektów, które nie są widoczne, w wyniku czego mapy mogą stać się bardzo duże bez jakiejkolwiek kary szybkości.

Wykonanie

Rysowanie ścian

Wszystkie ściany w Doom są narysowane pionowo; z tego powodu nie można prawidłowo patrzeć w górę iw dół. Możliwe jest wykonanie wyszukiwania w górę/w dół za pomocą „ścinania y” , a wiele nowoczesnych portów źródłowych Dooma to robi, a także późniejsze gry korzystające z silnika, takie jak Heretic . Zasadniczo działa to poprzez przesuwanie linii horyzontu w górę iw dół na ekranie, w efekcie zapewniając „okno” na wyższym widocznym obszarze. Przesuwając okno w górę iw dół można stworzyć iluzję patrzenia w górę iw dół. Zniekształca to jednak widok, im dalej w górę iw dół patrzy gracz.

Silnik Doom renderuje ściany podczas przechodzenia przez drzewo BSP, rysując podsektory według odległości od kamery, tak aby najbliższe segmenty były rysowane jako pierwsze. W miarę rysowania segmentów są one przechowywane na połączonej liście. Służy do przycinania innych segmentów renderowanych później, zmniejszając przerysowanie. Jest to również używane później do przycinania krawędzi ikonek.

Gdy silnik osiągnie solidną (1-stronną) ścianę w określonej współrzędnej x, nie trzeba już rysować linii w tym obszarze. Do przycinania silnik przechowuje „mapę” obszarów ekranu, w których osiągnięto solidne ściany. Pozwala to na całkowite przycięcie odległych części poziomu, które są niewidoczne dla gracza.

Doom Format graficzny przechowuje faktury ściany jako zestawy pionowych kolumnach ; jest to przydatne dla renderera, który zasadniczo renderuje ściany, rysując wiele pionowych kolumn tekstur.

Podłoga i sufit

System rysowania podłóg i stropów („mieszkań”) jest mniej elegancki niż ten stosowany do ścian. Mieszkania są rysowane za pomocą algorytmu typu flood fill . Z tego powodu czasami może się zdarzyć, że wykorzystany zostanie zły konstruktor BSP, aby uzyskać „dziury”, w których podłoga lub sufit spływają do krawędzi ekranu, błąd wizualny powszechnie określany jako „ślad śluzu”. Jest to również powód, dla którego jeśli gracz wyjdzie poza poziom za pomocą kodu noclip, podłogi i sufity będą wydawały się rozciągać z poziomu na pustą przestrzeń.

Podłoga i sufit są narysowane jako „visplanes”. Reprezentują one poziome ciągi tekstury, od podłogi lub sufitu na określonej wysokości, poziomie światła i teksturze (jeśli dwa sąsiednie sektory mają dokładnie tę samą podłogę, mogą zostać połączone w jedną visplane). Każda pozycja x w visplane ma określoną pionową linię tekstury, którą należy narysować.

Z powodu tego ograniczenia rysowania jednej pionowej linii w każdej pozycji x, czasami konieczne jest podzielenie visplanes na wiele visplanes. Rozważmy na przykład oglądanie podłogi z dwoma koncentrycznymi kwadratami. Wewnętrzny plac podzieli pionowo otaczającą podłogę. W tym poziomym zakresie, w którym narysowany jest wewnętrzny kwadrat, potrzebne są dwie visplane dla otaczającej podłogi.

Prowadzi to do jednego z klasycznych ograniczeń Dooma , które przez długi czas frustrowały wielu twórców map. Doom zawierał statyczne ograniczenie liczby visplanów; jeśli zostanie przekroczony, nastąpi "przepełnienie visplane", powodując wyjście gry do DOS z jednym z dwóch komunikatów: "No more visplanes!" lub „przepełnienie visplane (128 lub wyższy)”. Najłatwiejszym sposobem na wywołanie limitu visplane jest duży wzór podłogi w szachownicę; tworzy to dużą liczbę visplanes.

Gdy segmenty są renderowane, dodawane są również visplanes, rozciągające się od krawędzi segmentów w kierunku pionowych krawędzi ekranu. Rozciągają się one, aż dotrą do istniejących visplanów. Ze względu na sposób, w jaki to działa, system jest zależny od faktu, że segmenty są renderowane w porządku przez cały silnik; należy najpierw zbliżyć visplanes, aby mogły „odciąć” przez inne znajdujące się dalej. Jeśli nie zostanie zatrzymany, podłoga lub sufit „wykrwawi się” do krawędzi ekranu, jak opisano wcześniej. W końcu visplanes tworzą „mapę” poszczególnych obszarów ekranu, na której można rysować określone tekstury.

Podczas gdy visplanes są zbudowane zasadniczo z pionowych „pasków”, rzeczywiste renderowanie niskiego poziomu jest wykonywane w postaci poziomych „rozpiętości” tekstury. Po zbudowaniu wszystkich visplanów są one przekształcane w przęsła, które są następnie renderowane na ekranie. Wydaje się to być kompromisem: łatwiej jest skonstruować visplany jako pionowe paski, ale ze względu na charakter tekstury podłogi i sufitu łatwiej jest je narysować jako poziome paski.

Rzeczy (duszki)

Każdy sektor na poziomie ma połączoną listę rzeczy przechowywanych w tym sektorze. Gdy każdy sektor jest rysowany, duszki są umieszczane na liście duszków do narysowania. Jeśli nie znajdują się w polu widzenia, są ignorowane.

Krawędzie duszków są obcinane poprzez sprawdzenie listy wcześniej narysowanych segmentów. Sprite'y w Doomie są przechowywane w tym samym formacie kolumnowym, co ściany, co znowu jest przydatne dla renderera. Te same funkcje, które są używane do rysowania ścian, służą również do rysowania duszków.

Podczas gdy podsektory są gwarantowane w porządku, duszki w nich nie są. Doom przechowuje listę duszków do narysowania („vissprites”) i sortuje listę przed renderowaniem. Dalekie duszki są rysowane przed bliskimi. Powoduje to pewne overdraw, ale zwykle jest to znikome.

Ostatnią kwestią jest kwestia tekstur środkowych na liniach dwustronnych, stosowanych na przykład w przezroczystych paskach. Są one mieszane i rysowane z duszkami pod koniec procesu renderowania, a nie z innymi ścianami.

Gry wykorzystujące silnik Doom

Silnik Doom osiągnął większość swojej sławy dzięki zasileniu klasycznej strzelanki FPS Doom i był używany w kilku innych grach. Zwykle uważa się, że gry z silnikami Dooma „Wielka Czwórka” to Doom , Heretic , Hexen: Beyond Heretic i Strife: Quest for the Sigil .

Gry zbudowane bezpośrednio na silniku Dooma
Gry oparte na kodzie Doom lub Doom II

Zobacz też

Uwagi

Bibliografia

Zewnętrzne linki