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  Synchronizacja FTP za pomocą jednego kliku myszy

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  Jaka komórka dla programisty?

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ż

Najlepsza książka do Pythona Nie wiesz, z jakiej książki/ebooka uczyć się programowania w języku Python? Postanowiłem zrobić zestawienie 10 książek z Heliona na ten temat, abyś mó...
Komplet 28 ebooków i kursów, aby zostać programist... Od jakiegoś czasu dostaję zapytania na temat tego jakie książki, kursy i ebooki polecam. W związku z tym postanowiłem przygotować dzisiaj zestaw, któr...
120 tapet programistycznych za darmo do pobrania Trochę mi się nudziło, więc przygotowałem zestaw 120 tapet dla programistów. Możesz go pobrać. Tapety są w rozdzielczości 1366x768. Podzielone ...
10 fiszek do nauki programowania w Pythonie Uczysz się programowania w Pythonie? Pobierz te 10 fiszek, które ułatwią Ci zapamiętanie funkcji wbudowanych* w Pythona! Programowanie potrafi ...
Napisano w Kolumna

Menu