Ez a HSZ egy törölt részre hivatkozhat, de ha jól értem erre utal:
DX12-ben és VK-ban is készhez kapja az ember a teljes render_state_descriptor objektumot, amit állítgathat a program ahogy jónak látja. Ez az objektum magába foglalja az összes létező (amit az API elérhetővé tesz) állapotot, ami egy rajzolási parancsot befolyásolhat. Te, mint programozó, olyan objektumokat csinálhatsz, mint mondjuk
struct drawable {
vbo m_vbo;
ibo m_ibo;
render_state_descriptor m_desc;
};
Ilyen objektumokat behánysz egy tömbbe
std::vector<drawable> my_scene{ ... };
Te úgy akarod az összes objektumot kirajzolni, hogy a lehető legkevesebbet kelljen state-et váltani, mert az a költséges buli. Csinálhatod ezt mondjuk úgy, hogy:
auto it = std::cbegin(my_scene);
while (it != std::cend(my_scene))
{
render_state_descriptor state = *(it).m_desc;
auto next = std::partition(std::par, it, std::cend(m_scene), [&](const drawable& obj) { return obj.m_desc = state; });
Vk::set_state(state);
std::for_each(std::par, it, next, draw);
it = next;
}
Ez a gagyi kódnak látszó tárgy a gép összes magját felhasználva a tömb elejére gyűjti azokat, akiket ugyanúgy kell kirajzolni, mint az első olyan, ami még nem volt kirajzolva, aztán pedig az összes magot felhasználva rajzolási parancsokat ad ki (feltéve, hogy a draw egy globális függvény). A lényeg, pedig hogy a draw() függvényben már nincs ellenőrzés, hogy kell-e state-et váltani, mert kívül tudom garantálni, hogy a draw már mindig helyes állapottal van meghívva.
Ettől persze egy valódi engine 10.000-szer bonyolultabb, de ilyesmire lehet gondolni, hogy nem kell minden rajzolás előtt állapotot állítani, mert ez reprezentálható magában a rajzolandó cuccban. Eddig ezt a driver ellenőrizte DX11-ben és OpenGL-ben, hogy az egymás után kiadott rajzolási parancsok "ugye tényleg nem állítják a render state-et", és amikor kijött egy játék, akkor minden ilyen ellenőrzést szelektíve kapcsolgattak ki a gyártók, hogy mit lehet elhagyni, mert tényleg jól használod az API-t. Itt a te kezedben van minden és jobban is csinálhatod, mint a driver, mert neked globális információd van arról, hogy mit akarsz csinálni, ami az egyes rajzolási parancsokból külön már nem látszik.
[ Szerkesztve ]