Silnik gier 3D w C++

B9
  • Rejestracja:około 11 lat
  • Ostatnio:ponad 4 lata
  • Postów:9
9

Cześć!

Z góry ostrzegam, że ten mój post będzie bardzo długi. Nie mniej mam nadzieję, że nie będzie to nudne i uda mi się złapać czyjąś uwagę i kogoś to zainteresuje. Każda opinia jest dla mnie cenna i postaram się odpowiedzieć, jeżeli tylko będę potrafił udzielić merytorycznej odpowiedzi.

Jakieś 9 miesięcy temu wpadłem na pomysł, że muszę sobie napisać jakiś projekcik po godzinach. Chciałem, żeby było to coś ambitnego i wyróżniającego się, a nie kolejnego CRUDa, chociaż ja nic nie mam do CRUDów. Także w mojej głowie zrodził się pomysł stworzenia własnego silnika do gier od zera. Zawsze lubiłem zabawę silnikami do gier takimi jak Unity, czy Unreal Engine (kiedyś UDK, a teraz UE4). Pomyślałem jednak, że warto po godzinach sobie zgłębić jak te silniki działają i napisać własny taki silnik. Tak właśnie zrodził się projekt "CLUSEK".

CLUSEK to mój autorski silnik do gier, który napisałem od zera z wykorzystaniem DirectX 11 oraz PhysX (dokładne informacje na temat zależności znajdują się w dokumentacji). Silnik ma zaimplementowane na tyle dużo rzeczy, że pomyślałem, że pochwalę się nim tutaj na forum. Trochę boję się krytyki, ale kto nie ryzykuje ten nic nie ma.

No dobra, ale co ma w sobie ten CLUSEK? Cała architektura oparta o ECS (Entity Component System), który umożliwia mi dość szybko dodawać nowe elementy do silnika bez modyfikowania dużych kawałków kodu. Po prostu dodaje nowy system, który coś robi z encjami, które to składają się z komponentów. Kolejna sprawa to dość zaawansowany na tą chwilę renderer w DirectX 11, który ma sporo elementów, którymi mogę się pochwalić. Cienie, renderowanie oparte na fizyce (PBR), teren z teselacją to tylko kilka rzeczy, które ma ten renderer, a jest ich o wiele więcej. Fizyka oparta o bibliotekę Nvidia PhysX w wersji 4.1, która pozwala mi symulować bryły sztywne w dość realistyczny i wydajny sposób. Do tego niesamowicie zaawansowana symulacja pojazdów czterokołowych, która obejmuje takie podstawowe rzeczy jak skrzynia biegów, czy sprzęgło ale też bardziej zaawnsowane jak na przykład stabilizator poprzeczny. No i oczywiście edytor, który pozwala zarówno modyfikować wszystko z poziomu UI silnik po wciśnięciu "~", jak i z poziomu plików JSON oraz własnego formatu danych. Jest też logger, który pozwala na zapis do konsoli lub pliku oraz posiada różne poziomy loggowania (debug, warning oraz error).

Także troszkę tych elementów już mam i dlatego gotowy jestem pokazać jak to wszystko pospawane ze sobą razem wygląda. Poniżej kilka zdjęć z silnika. Starałem się wybrać jakieś fajne ujęcia, które pokazują mocne strony silnika.
CLUSEK 0

CLUSEK 1

CLUSEK 2

CLUSEK 3

Także to tyle w tym temacie. Na koniec jeszcze chciałem wam podrzucić link do repozytorium kodu, który jest tutaj. Z góry ostrzegam, że repozytorium jest ogromne. Także polecam kod przeglądać bezpośrednio na GitHub. Jeżeli chcecie sobie to potestować, ale nie chcecie tracić czasu na długą budowę kodu to polecam pobrać wersję wykonywalną projektu. Jest to skompilowana wersja ze wszystkimi wymaganymi plikami. Poza tym pobieranie tego projektu z repozytorium przez dużą liczę osób może być problematyczne przez dość restrykcyjną politykę GitHub dla projektów korzystających z LFS. Cóż... może kiedyś zmigruje ten projekt na Bitbucket lub na GitLab.

B9
  • Rejestracja:około 11 lat
  • Ostatnio:ponad 4 lata
  • Postów:9
0

Czy uda mi się znaleźć kogoś z gamedev, kto rzuci okiem na kod źródłowy i udzieli jakichś rad?

SH
  • Rejestracja:prawie 5 lat
  • Ostatnio:prawie 5 lat
  • Postów:14
0

Fajna sprawa. Nie znam się na tym, ale też pewnie w miarę upływu czasu zmierzę się z tym tematem. Mam pytanie trochę może z innej beczki. A jak taki silnik 3D ma współpracować z okularami VR i czy coś będziesz próbował robić w kierunku rzeczywistości rozszerzonej z tym silnikiem i pracy ze sprzętem VR. Masz jakieś wnioski na ten temat?

B9
  • Rejestracja:około 11 lat
  • Ostatnio:ponad 4 lata
  • Postów:9
0
shab napisał(a):

Fajna sprawa. Nie znam się na tym, ale też pewnie w miarę upływu czasu zmierzę się z tym tematem. Mam pytanie trochę może z innej beczki. A jak taki silnik 3D ma współpracować z okularami VR i czy coś będziesz próbował robić w kierunku rzeczywistości rozszerzonej z tym silnikiem i pracy ze sprzętem VR. Masz jakieś wnioski na ten temat?

Nie zagłębiałem się w ten temat, ale myślę, że będzie to kupa pracy. Po pierwsze na pewno trzeba będzie zaimplementować SDK do obsługi gogli, czyli np. Oculus Rift SDK. Jeżeli ktoś by chciał mieć kilka rodzajów gogli to myślę, że trzeba zaimplementować kilka SDK. Potem trzeba dostosować renderer do tego. Nie jestem pewien jak i nie chciałbym Cię wprowadzić w błąd, ale pewnie trzeba renderować do wielu render targetów dla prawego i lewego oka, następnie do przekształcić tak, żeby obraz wyglądał poprawnie w soczewkach, a następnie połączyć w jeden render target za pomocą jakiegoś comput shadera. Także to może być niewyobrażalna ilość pracy. Także w 99% zastosowań lepiej będzie użyć Unity lub UE4 moim zdaniem.

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)