Programowanie grafiki - C++ czy Rust

Programowanie grafiki - C++ czy Rust
F9
  • Rejestracja:ponad 4 lata
  • Ostatnio:5 dni
  • Postów:76
0

Hej, od paru miesięcy uczę się OpenGL z użyciem Rusta, piszę własny prosty render. Zacząłem się jednak zastanawiać czy nie wrócić do C++, którego używam w pracy ale nie związanej z grafiką. Chciałbym być może w przyszłości znaleźć pracę jako Graphic/Engine Programmer i się zastanawiam czy uczenie się Rusta z openGL/vulkanem, zamiast maksowania C++ to lepsze rozwiązanie. Problem jest tylko taki, że ja nie mogę zdzierżyć tego C++ :) nie chcę wchodzić w szczegóły ale ten język wraz z Cmake generuje tyle niepotrzebnych problemów...
Podsumowując, jeśli poważnie myślę kiedyś o roli Graphic Programmer to czy Rust w ogóle może mi się przydać? Czy tylko iść w C++?

Spearhead
  • Rejestracja:prawie 6 lat
  • Ostatnio:około 3 godziny
  • Postów:1002
2

Póki co C++ wyraźnie dominuje, chociażby z tego względu, że wsparcie Rusta na konsolach jest ciągle znikome jeśli nie zerowe. Problem tu taki, że to są zamknięte systemy, a pisanie gier na nie wymaga podpisania umowy z korporacją i dostania odpowiednich development kitów, co blokuje ludziom od open source rozwijania jakichś alternatyw (patrz opis https://docs.godotengine.org/en/stable/tutorials/platform/consoles.html na stronie Godota gdzie opisują sytuację). Słyszałem, że komuś tam udało się coś skompilować i odpalić, ale generalnie póki co jest się skazanym na C++ czy C# jeżeli ktoś używa Unity.

Nawet zaś pomijając same konsole i ograniczając do PC/mobilnych to generalnie niewiele się dzieje, jeżeli chodzi o użycie Rust w gamedevie. W sieci krąży dowcip, że to język, w którym powstało do tej pory więcej silników niż faktycznych gier. Pomijając jakąś drobnicę z game jamów faktycznie ciężko coś wskazać. Jednym z głośniejszych tytułów to wydane dość niedawno Tiny Glade (https://store.steampowered.com/app/2198150/Tiny_Glade/), mały indyk robiony przez dwie osoby. Pisali to z użyciem Bevy, tyle że napisali własny renderer. Poza tym trudno wskazać cokolwiek, co na tle setek gier w C++/C# jest cokolwiek marnie. Kojarzę, że było jakieś inne indie studio, które eksperymentowało z Rustem, ale chyba też się z czasem wycofali. Oprócz tego parę miesięcy temu dość głośny był post Leaving Rust gamedev after 3 years, który zebrał też sporo komentarzy na HN i r/programming. Generalnie - Rust ma swoje nisze, ale w gamedevie na razie się nie przyjmuje.

Co natomiast będzie za ~5/10 lat to znowu trudno przewidzieć, ale na chwilę obecną C++ w silnikach 3D trzyma się mocno i nigdzie raczej nie wybiera.

SL
  • Rejestracja:około 7 lat
  • Ostatnio:około 5 godzin
  • Postów:866
2

Gamedev jest bardzo konserwatywnym środowiskiem. Do tego Rust nie wnosi tak wiele do gamedevu jak w innych branżach. Gamedev nie wymaga takiego poziomu bezpieczeństwa jak przeglądarki/serwery/libki.

Pewnie powoli będzie się coś zmieniało, ale szczerze wątpię, żeby w bliskiej przyszłości zaczeło się coś dziać więcej

F9
  • Rejestracja:ponad 4 lata
  • Ostatnio:5 dni
  • Postów:76
0

@Spearhead Dzięki za fajną kompilacje informacji. @slsy Patrząc na jakość kodu pisanego przez gamedev w C++, nie dziwię się, że branża w kryzysie :) tak pół żartem pół serio. Rust na pewno wniósłby jakość kodu, choc z drugiej strony to chyba silnik jest najważniejszy (Unity ,Unreal czy Godot). Trochę się bawiłem silnikami tymi ale czysto dla zabawy.

Spine
  • Rejestracja:prawie 22 lata
  • Ostatnio:9 minut
  • Postów:6627
0
Fargo94 napisał(a):

Hej, od paru miesięcy uczę się OpenGL z użyciem Rusta, piszę własny prosty render.
[...]
Chciałbym być może w przyszłości znaleźć pracę jako Graphic/Engine Programmer

Ambitnie. Może moje obawy nie mają odzwierciedlenia w rzeczywistości, jednak moim zdaniem warto przemyśleć tą decyzję.

Jak sobie wyobrażasz taką pracę?

Bo ja sobie wyobrażam, że w firmach rozwijających silniki, które zatrudniają ludzi na takie stanowisko, czekają nietrywialne zadania.
Wszystkie rzeczy, które musi mieć prosty render zostały tam już zaimplementowane.
Na programistów takiego silnika czekają takie zadania:

  • dodatkowe, nieznane feature'y,
  • optymalizacja istniejącego kodu,
  • debugowanie.

Chyba, że trafisz do jakiegoś startup'u, który tworzy nowy silnik od zera.
To wtedy będziesz mógł po swojemu na czysto zrobić lepiej wszystko co jest znane z innych silników.
Praktycznie żadnych niewiadomych. Tylko trzeba dobrze ogarniać duże projekty ;)

Dlaczego piszesz "własny prosty render"?

Pod konkretny projekt, żeby zrobić w swoim silniku grę?
Czy po prostu interesuje Cię jak zbudowane są silniki i to co w swoim silniku wyprodukujesz, to będą raczej demosy pokazujące możliwości Twojego silnika?


🕹️⌨️🖥️🖱️🎮
edytowany 3x, ostatnio: Spine
F9
  • Rejestracja:ponad 4 lata
  • Ostatnio:5 dni
  • Postów:76
1

@Spine właśnie ciężko mi sobie taką pracę wyobrazić :) obstawiam, że ktoś ma swój silnik i dodaje do niego feature'y albo firma korzysta z UE i trzeba pisać jakieś customowe efekty.

Natomiast pisze własny render na podstawie stronki learnopengl. Czytam rozdział i staram się go zaimplementować u siebie. Wydaje mi się, że to najlepsza metoda na naukę renderingu. Wadą jest to, że muszę często rozwiązywać architektoniczne problemy, które nie są proste np. implementacja systemu ECS czy jakieś matematyczne akrobacje.

Natomiast zaletą taka, że parę linijek i mam efekt graficzny jaki chce bo znam na wylot swój "silnik".

Może jak kiedyś ogarnę dokumentację i fajne demo to się nim pochwałę na mikroblogu.

Odpowiadając jeszcze na Twoje pytanie, interesuje mnie jak silniki działają i chce zrobić demo układu słonecznego, jakąś prostą symulacje. Nie mam ambicji robić tak gry, to wtedy myślę użyje Godota jak mnie najdzie na gierkę.

Spine
  • Rejestracja:prawie 22 lata
  • Ostatnio:9 minut
  • Postów:6627
1
Fargo94 napisał(a):

Natomiast zaletą taka, że parę linijek i mam efekt graficzny jaki chce bo znam na wylot swój "silnik".

Moim zdaniem efekty graficzne można sprowadzić do kilku standardowych rzeczy, które powinny być w zaimplementowane w silniku lub komponentach z nim dostarczanych.

  • Particle System z możliwością przypisania shaderów renderowanych cząsteczek,
  • Możliwość przypisania shaderów obiektom 3D,
  • Możliwość przypisania shaderów dla renderowanych klatek (postprocessing).

Jak widać, shadery przy renderowaniu są wszechobecne ;)

Z takim zestawem użytkownik osiągnie chyba każdy efekt graficzny.
A czy to będzie łatwe, czy skomplikowane zależy od dodatkowych warstw abstrakcji i presetów dołączonych do silnika.


🕹️⌨️🖥️🖱️🎮
edytowany 2x, ostatnio: Spine
F9
  • Rejestracja:ponad 4 lata
  • Ostatnio:5 dni
  • Postów:76
1

Właśnie mam problem z customowymi shaderami. Na chwilę obecną nie można ich dodawać bo za dużo logiiki renderowania w nich siedzi. Mam na myśli obliczanie oświetlenia modelem phonga (jeśli jest źródło światła), obsługa tekstur czy kolorów (jeden na obiekt czy per wierzchołek). Wiem, pewnie coś spartaczylem bo śmierdzi mi tu antywzorcem ale nie wiem i nie znalazłem lepsze metody jak do tej pory. Ciężko mi sobie wyobrazić ta swobodna możliwość przypisania shaderow :) skoro jak ktoś doda shaders bez obliczania światła to obiekt wyjdzie poza system oświetlenia i będzie np. czarny obiekt przy lampie.

Spine
  • Rejestracja:prawie 22 lata
  • Ostatnio:9 minut
  • Postów:6627
1

Obiekty 3D bez oświetlenia też są potrzebne i mogą współistnieć na scenie z oświetlonymi obiektami.
Np. jeśli chcesz zrobić, że oczy postaci świecą jak w Mortal Kombat 11 (kolory HDR + bloom postprocessing), to nie chcesz żeby trójkąty oczu reagowały na lampę w żaden sposób.

W Unity takie shadery nazywają się Unlit:
screenshot-20250203222038.png

Jak tworzysz materiał w ShaderGraph w Unity, to też możesz wybrać rodzaj materiału Unlit:

screenshot-20250203222351.png


🕹️⌨️🖥️🖱️🎮
edytowany 4x, ostatnio: Spine
obscurity
  • Rejestracja:około 6 lat
  • Ostatnio:około 16 godzin
3

proponuję poznać jakiś istniejący silnik w bardzo dobrym stopniu od strony użytkownika przed zabieraniem się do implementacji własnego


"A car won't take your job, another horse driving a car will." - Horse influencer, 1910
Spine
W 150% popieram. Chociaż widziałem na tym forum gościa, który nigdy nie wykazał się znajomością jakiegoś silnika, a z uporem maniaka tworzy własny silnik... Ciekawe co mu z tego wyjdzie ;) Jak dożyjemy to zobaczymy.
F9
Prawda ale bardziej mi zależy na nauce opengl/vulkan. Silnik jest efektem ubocznym tej nauki. No ale zgadzam się, pewnie byłoby o wiele łatwiej.
F9
  • Rejestracja:ponad 4 lata
  • Ostatnio:5 dni
  • Postów:76
0

@obscurity To taki lekki silnik jak Godot byłby okey? Nie wiem czy chce startować do takich kobył jak Unity czy UE

Spine
  • Rejestracja:prawie 22 lata
  • Ostatnio:9 minut
  • Postów:6627
1

Nie używałem Godot, więc nie mogę go ocenić.
Moim zdaniem jest duża szansa, że silnik używany przez większość programistów jest przyjazny dla początkujących:

screenshot-20250203224416.png

Próbowałem Unreal. Unity moim zdaniem jest znacznie bardziej user-friendly.
Nie musisz od razu ogarnąć całego silnika, a Unity sprytnie ukrywa rzeczy, których dany obiekt nie używa, poprzez system komponentów.

MS Word to też kobyła, a nie musisz ogarniać jego wszystkich funkcji, żeby napisać w nim jakiś tekst ;)


🕹️⌨️🖥️🖱️🎮
edytowany 2x, ostatnio: Spine
AT
  • Rejestracja:ponad 9 lat
  • Ostatnio:19 dni
  • Postów:24
1

Jeśli piszesz sobie własny renderer, żeby nauczyć się grafiki, to wybierz sobie taki język, w którym ci się najwygodniej pisze. Nie ma znaczenia, czy to będzie C++, Rust czy JavaScript.

obscurity
  • Rejestracja:około 6 lat
  • Ostatnio:około 16 godzin
2
Fargo94 napisał(a):

Prawda ale bardziej mi zależy na nauce opengl/vulkan. Silnik jest efektem ubocznym tej nauki. No ale zgadzam się, pewnie byłoby o wiele łatwiej.

Będzie ci się łatwiej uczyć i nie będziesz ciągle odkrywał koła na nowo jeśli najpierw poużywasz czegoś podobnego; tworząc coś samemu bez zapoznania się dobrze z tematem ciężko w ogóle natrafić na problemy do rozwiązania. Poza tym może się okazać że jest wystarczająco wiele wyzwań na wyższym poziomie i nie musisz schodzić aż tak nisko, bo szczerze mówiąc nie wróżę dużych sukcesów w szukaniu pracy na tak niskim poziomie.
Kiedyś lata (w wolnym czasie) poświęciłem pisząc własny silnik, ale praca z directx mi nie wystarczyła i zszedłem tak nisko że czytałem artykuły jak w ogóle działa rasteryzacja, teselacja, nakładanie tekstur, cieniowanie na najniższym poziomie, z ciekawości zaprogramowałem oteksturowaną i oświetloną scenę 3d działając jedynie na pikselach na cpu. I szczerze mówiąc to do niczego mi się to nie przydało. Ciekawość zaspokojona ale straciłem sporo cennego czasu.

W unity możesz programować np własny custom rendering pipeline i to już jest wystarczające moim zdaniem wyzwanie.
Jak już liźniesz podstaw to proponuję przejść na wyższy poziom, na coś co faktycznie będzie użyteczne w pracy, bo tylko szaleńcy piszą grę na własnym silniku (chyba że to tetris...)


"A car won't take your job, another horse driving a car will." - Horse influencer, 1910
edytowany 1x, ostatnio: obscurity
F9
Coś w tym jest, z tym schodzeniem coraz głębiej i głębiej, a potem kończę wieczór nad książką do matematyki :)
TZ
  • Rejestracja:około rok
  • Ostatnio:około 2 miesiące
  • Postów:7
1

Nie ma dużego zapotrzebowania na ludzi od grafiki, ale fakt że jak już jest to miewają problemy kogoś znaleźć (w jednej firmie ludzi którzy umieli w silniki a nie znali API graficznych nie chcieli). Czego się uczyć żeby znaleźć robotę - nie wiem. Mnie do Rusta trochę WebGPU przyciągnęło, a dokładniej biblioteka wgpu (jest jeszcze druga biblioteka Dawn z której Chrome korzysta, ale nie lubię systemu budowania od Googla). Czy z tego będzie praca - wątpie, przynajmniej nie teraz, ale WebGPU wydaje się krokiem w stronę Vulkana, mniej pierdzielenia się z drobnicą a API bardziej explicit niż w OpenGLu.

OpenGL bywa w embedded wykorzystywany, więc pewnie tu praca się jakaś znajdzie. Jeśli chodzi o gejmdev... czasem chcą ludzi którzy rozumieją moduły dotyczące renderowania w różnych silnikach. U nas to raczej mało kto pisze własny silnik, więc sama znajomość API od grafiki może nie wystarczać.

Co do Phonga, oświetlenia, można jeszcze poczytać o Physically Based Rendering, co to są BRDFy/BSDFy.

edytowany 1x, ostatnio: TańczącyZBłędami
F9
Generalnie chciałbym się skupić na Vulkanie ale zacząłem od OpenGL bo jest więcej źródeł do nauki. Może też popatrzę w przyszłości co to WebGPU.
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)