@@ -71,3 +71,80 @@ static auto create_instance() -> vk::UniqueInstance
...
@@ -71,3 +71,80 @@ static auto create_instance() -> vk::UniqueInstance
## Swapchain
## Swapchain
A `vk::SurfaceKHR`-hez hasonlóan létezik egy `vk::SwapchainKHR` is, amivel "rajzolni" tudunk a kapott ablakfelszínre.
A `vk::SurfaceKHR`-hez hasonlóan létezik egy `vk::SwapchainKHR` is, amivel "rajzolni" tudunk a kapott ablakfelszínre.
Az ablakfelszínnel ellentétben ezt mi fogjuk most létrehozni és felkonfigurálni.
??? example "Vegyük fel az új (még üres) `Swapchain` osztályt."
```cpp title="Swapchain.hpp"
class Swapchain {};
```
Ahogyan majd később látni fogjuk, a swapchain nem mindig lesz valid állapotban.
Ez egy *immutable* objektum, és ha például az ablak mérete változik, akkor újra létre kell hozni.
Éppen ezért vegyünk fel egy **opcionális** swapchain változót a `Renderer`-be.
!!! example ""
```cpp title="Renderer.hpp"
class Renderer {
// ...
std::optional<Swapchain> m_swapchain;
};
```
### Extent
A swapchain feladata a [double/triple buffering](https://gameprogrammingpatterns.com/double-buffer.html) implementálása a rajzolt képek megjelenítéséhez, amihez értelemszerűen több képet is kezelnie kell.
A swapchain létrehozásakor legyen az első lépésünk ezen képek felbontásának megadása.
Fontos, hogy a létrehozott ablak felbontása nem feltétlenül ugyan az képernyő- és pixelkoordinátákban, ezért a *main.cpp*-ben használt `1280x720` nem fog működni.
A GLFW könyvtár a pixelkoordinátákban vett felszínt *framebuffer*-nek nevezi.
Ennek a méretét kell majd lekérni az ablaktól.
Sok esetben a kapott ablakfelszín segítségével lekérdezhető a hozzá tartozó méret is, de néha ez többféle érték is felhasználható.
Ilyenkor *clamp*-elni kell az általunk használni kívánt értéket a felszín által definiált min és max értékek közé.