Prosty renderer 3D napisany w C++ z wykorzystaniem OpenGL.
- C++
- OpenGL
- GLAD
- GLSL
- GLFW
- GLM
- ImGui (Dear ImGui)
- stb_image
- CMake
- Ładowanie Modeli 3D: Obsługa ładowania modeli z plików (np. format
.objdla obiektów takich jak pociąg, dinozaury, podłoże). - Różne tryby kamery: statyczna obserwująca scenę, statyczna śledząca obiekt, przyczepiona do obiektu (np. pociągu), swobodna (free-look).
- Oświetlenie:
- Model oświetlenia Phong oraz Blinn-Phong (dynamicznie przełączane).
- Światła punktowe
- Światło kierunkowe
- Reflektor (Spotlight) - światło czołowe pociągu
- Efekt mgły
- GUI
- Powierzchnie Beziera:
- Renderowanie płata Beziera z wykorzystaniem shaderów teselacji, z możliwością dynamicznej zmiany poziomu teselacji.
git clone --recursive https://github.com/kasrow12/3DRenderer.git
cd 3DRenderer
cmake -S . -B build -G "Visual Studio 17 2022"
cmake --build build --config Release && build\Release\My3DRenderer.exe
Widok siatki trójkątów
Efekt mgły

| Klawisz | Akcja |
|---|---|
| 1 | Statyczna kamera |
| 2 | Śledząca kamera |
| 3 | Kamera z perspektywy pociągu |
| 4 | Kamera swobodna |
| F | Przełącz widok siatki (Wireframe) |
| B | Przełącz Blinn-Phong |
| N | Przełącz Dzień/Noc |
| WASD | Poruszanie kamerą |
| Space | W górę |
| Left Shift | W dół |
| Left Control | Przechwycenie myszy |
| Scroll | Zoom |
Dzięki zastosowaniu shaderów teselacji, możliwe jest wygenerowanie dodatkowych wierzchołków, które pozwalają na zwiększenie rozdzielczości powierzchni.
Do teselacji potrzebne nam są:
- Control Shader - kontroluje ilość generowanych wierzchołków, parametr tessLevel określa ilość generowanych dodatkowych wierzchołków na krawędź
- Evaluation Shader - oblicza pozycje nowych wierzchołków i wylicza wartości powierzchni Beziera
Potok renderowania z teselacją wygląda następująco:
- Vertex Shader
- Tessellation Control Shader
- Tessellation Evaluation Shader
- Fragment Shader
W aplikacji użytkownik może zmienić rozdzielczość powierzchni Beziera w menu. Aby lepiej uwidocznić efekt, można włączyć tryb wyświetlania siatki (klawisz F).
Aby włączyć teselację należało wywołać funkcję
glPatchParameteri(GL_PATCH_VERTICES, 16);
, dzięki czemu OpenGL wie, że płat wejściowy będzie się składać z 16 wierzchołków.
Następnie skoro mamy tylko jeden płat, to wyświetlenie jego można zrealizować poprzez
glDrawArrays(GL_PATCHES, 0, 16);.
We fragment shaderze użyta składowa zwierciadlana (Phonga/Blinn) zależy od uniformu blinn.
W aplikacji można zmieniać wartość tej zmiennej, tym samym składowej zwierciadlanej za pomocą klawisza B.
Źródło
float spec = 0.0;
if (blinn)
{
vec3 halfwayDir = normalize(lightDir + viewDir);
spec = pow(max(dot(normal, halfwayDir), 0.0), material.shininess);
}
else
{
vec3 reflectDir = reflect(-lightDir, normal);
spec = pow(max(dot(viewDir, reflectDir), 0.0), material.shininess);
}