Najtrudniejsze zadanie dla programistów, które wydaje się proste

Co jest najtrudniejszym zadaniem programistycznym, które dla innych wydaje się proste? Przeczytaj i dowiedz się, dlaczego uważam, że to jest programowanie gier komputerowych 3D.

Rok temu na Quorze pojawiło się pytanie “Co jest najtrudniejszym zadaniem dla programistów, które wydaje się dla innych proste”. Udzieliłem na to pytanie odpowiedź po angielsku. Zyskała 4700 głosów i niemal milion wyświetleń. Postanowiłem przetłumaczyć tą odpowiedź na język polski. Oto o ona. Zachęcam do lektury:

Co jest najtrudniejszym zadaniem dla programistów, które wydaje się dla innych proste: Tworzenie gier 3D

Pozwólcie, że cofniemy się trochę w czasie:

1981

Zostaje opublikowana pierwsza gra 3D o nazwie Tempest. Zwróćcie uwagę, że programiści gry znaleźli sposób na obliczanie pozycji punktów i linii w 3D oraz sposób na ich wyświetlanie na ekranie 2D:

Po pewnym czasie programiści znaleźli sposób, aby wyświetlać ściany i “oszukane” płaskie postaci. Ten screen pochodzi z gry Wolfenstein:

Po złym, płaskim gościu nadeszła era trójwymiarowego modelowania postaci w grze. Mogę tu wspomnieć o Larze Croft z Tomb Raidera. Była prawdziwą pięknością:

W tym czasie pojawiło się kilka nowych technologii. Ruszył MMX. To był zestaw instrukcji do szybszego wykonywania większej ilości dokładnych operacji na procesorze.

Akceleratory graficzne i biblioteka OpenGL otworzyła erę operowania n obiektach 3D za pomocą bezpośrednich instrukcji.

Zaczęła się prawdziwa zabawa. Ale pojawiły się też trudności. Dwie główne, które towarzyszyły branży przez lata to: za mała ilość pamięci i za mało mocy obliczeniowej.

Czytaj podobne  Serwer Apache i IIS na jednym komputerze

Jak obejść za małą ilość pamięci? Ładujmy grafikę spikselowaną, gdy gracz jest daleko i nazwijmy to MIP MAPPINGIEM. Chociaż później ładowano całe mipmapy do pamięci, to na początku robiono to częściowo by zaoszczędzić pamięć:

Ale to nie jest jeszcze dobre. Wszystko wygląda… płasko… zróbmy mapę wypukłości i nałóżmy na obiekt, aby imitować wypukłości, wgłębienia i światło…

Ale zaraz. Tekstury zepsuły się, gdy obracamy obiekty. Musimy oprogramować korekcję perspektywy:

Ładnie. Ale nadal wszystko wygląda dziwnie. Ah.. musimy wymyślić sposób, by wyświetlać cienie. Przynajmniej oszukując trochę (MDK niżej) albo pisząc bardziej realny shadow mapping:

Teraz lepiej. Ale zaraz… czy projektant faktycznie umieścił w grze lustro? Musimy śledzić światło. Nazwiemy to ray tracingiem albo troszkę oszukamy (przykład: Duke Nukem 3D):

Oh. Teraz to wygląda ładnie. Wyjdźmy z bunkra na przestrzeń otwartą.

Ale… co to jest? Dlaczego widzę rzeczy, które są bardzo daleko, jakby były blisko w Gothic 1?

Zaprogramujmy rozmywanie i mgłę, aby sceneria wyglądała naturalniej i używała mniej procesora. Teraz lepiej:

Powyżej wymieniłem tylko kilka przykładów. A musimy wymyślić więcej rzeczy do wyświetlenia w grze:

a) cząstki jak woda albo ogień. W rzeczywisości są to sprite’y zawsze skierowane przodem do kamery. Dużo takich cząstek wygląda tak:

b) Refleksy świetlne i efekty soczewkowe. Podobna technika jak z cząsteczkami, ale względem Słońca:

Krótka lista kilku podstawowych potrzeb, które programiści 3D musieli zaspokoić:

  1. Coś do budowania świata innego niż ostre trójkąty
  2. Coś, aby wiedzieć, gdy obiekt uderzy w obiekt. To jest nazywane wykrywaniem kolizji.
  3. Niebo. W pierwszych grach była to kula z teksturą w środku. Niebiańska “bańka” przesuwała się graczem
  4. Sprawienie, żeby tekstury były bardziej realistyczne. Dużo technik, w tym filtrowanie tekstur.
  5. Jak zrobić wodę
  6. Jak wyświetlać trójwymiarowe drzewa? Miliony małych trójkątów? Musimy mieć coś, co zużywa mniej mocy procesora i wygląda lepiej.
  7. Jak wyświetlać trawę? Jak trawa ma się poruszać i reagować na inne obiekty.
  8. Jak znaleźć ścieżkę między punktami, tak by postać mogła poruszać się łagodnie po świecie.
  9. Jak śledzić naboje i rakiety itp.
  10. Jak wyświetlać coś, co zostało zepsute np. ściany. Trzeba było obliczać proces niszczenia albo trochę to oszukiwać.
  11. Jak podzielić świat na małe części, aby nie renderować wszystkiego. Na przykład jeśli jesteś w jednym pokoju, nie musimy renderować pozostałych pokojów w zamku tylko ten jeden. W rzeczywistości musimy renderować też pokoje, które widać z tego pokoju. Ale nie widzisz całych innych pokoi. Więc możemy zignorować ich część. Widzisz do czego zmierzam? Dużo obliczeń, aby renderować jak najmniej i zaoszczędzić moc procesora graficznego.
Czytaj podobne  10 rzeczy, których żałuję, że nie wiedziałem, gdy zaczynałem programować

Mógłbym wymienić jeszcze mnóstw innych technologii. Ale już ta lista wyżej pokazuje wystarczająco dobrze. Programowanie gier jest bardzo skomplikowanym procesem. Mnóstwo sprytnych pomysłów pozwala na tworzenie coraz lepszych gier.

Takich jak np. zbliżający się Cyberpunk 2077, który na pewno wprowadzi do rynku kilka innowacji:

Przeczytaj też

Jak nauczyć się programowania od zera? Wiele osób pyta, jak nauczyć się programowania od zera. Z tego wpisu dowiesz się, jak to zrobić. Programuję od 20 lat. Dzielę się doświadczeniami moim...
Praca na stojąco, a programowanie. Test za 65 zł Czy wyobrażasz sobie całodzienny standup? Dowiedz się, dlaczego warto pracować na stojąco, oraz jakie dało mi to wyniki. Ostatnio gdy byłem na ...
Współpraca grafika (UX designera) i programisty Sprawdź, czy kilka pikseli różnicy wpływa na estetykę designu, oraz czy UX to detale, czy ogólny wygląd. Ostatnio na grupie dla grafików trafił...
Kupon rabatowy na kurs programistyczny W VideoPoint ruszyła wiosenna promocja 2 za 1. Można mieć dwa kursy m.in. programistyczne w cenie 1. Wybór kursów jest bardzo duży. Jest Py...
Rozstrzygnięcie konkursu na kurs programowania Niedawno skończył się czas na zgłaszanie się do konkursu na kurs programistyczny i są już wyniki tego konkursu! Konkurs polegał na tym, aby...
Napisano w Programowanie