OpenGL: Batch Renderer: mali By Transformácie sa uskutoční na CPU alebo GPU?

0

Otázka

Som rozvojových 2D herný engine, ktorý bude podporovať 3D v budúcnosti. V tejto aktuálnej fáze vývoja, pracujem na dávku renderer. Ako niektorí z vás možno vedia, keď dávkovacia grafika spolu, jednotné podporu pre farebné (RGBA), textúra súradnice, textúra ID (textúry index), a model transformácie matice ísť von oknom, ale namiesto toho prešiel vrchol buffer. Práve teraz, som zaviedli absolvovaní model pozícia, farba, textúra súradnice, a textúru ID uzla buffer. Môj vrchol buffer formát vyzerá to práve teraz:

float* v0 = {x, y, r, g, b, a, u, v, textureID};
float* v1 = {x, y, r, g, b, a, u, v, textureID};
float* v2 = {x, y, r, g, b, a, u, v, textureID};
float* v3 = {x, y, r, g, b, a, u, v, textureID};

Ja som o integrovať výpočtu, kde sa objekt by mal byť v svete miesta pomocou transformation matrix. To ma vedie k položiť otázku:

By transformation matrix sa vynásobí model vertex pozície na CPU alebo GPU?

Niečo mať na pamäti, je, že ak by som prejsť na vrchole buffer, ja by som nahrať transformation matrix raz za vertex (4 krát za sprite), ktorý sa mi javí ako strata pamäti. Na druhej strane, vynásobením model vertex pozície transformáciou matice na CPU zdá sa, ako by to bolo pomalšie v porovnaní s GPU je súbežnosť schopnosti.

To je, ako môj vrchol buffer formát bude vyzerať, ako keby som vypočítať transformovať na GPU:

float* v0 = {x, y, r, g, b, a, u, v, textureID, m0, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12, m13, m14, m15};
float* v1 = {x, y, r, g, b, a, u, v, textureID, m0, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12, m13, m14, m15};
float* v2 = {x, y, r, g, b, a, u, v, textureID, m0, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12, m13, m14, m15};
float* v3 = {x, y, r, g, b, a, u, v, textureID, m0, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12, m13, m14, m15};

Otázka je väčšinou teoreticky riadený. Takže, teoretické a technické odpoveď bude veľmi ocenil. Ale pre informáciu, tu je kód.

c++ glm-math glsl opengl
2021-11-24 03:43:20
2

Najlepšiu odpoveď

1

By Transformácie sa uskutoční na CPU alebo GPU?

Naozaj to závisí od situácie. Ak ste znova odoslať vrcholov, každý rám, najlepšie je kritériom to, čo je najlepšie pre váš prípad. Ak chcete animovať bez resubmitting všetky vrcholy, nemáte inú možnosť aplikovať ho na GPU.

Bez ohľadu na dôvod, ak sa rozhodnete použiť transformácie na GPU, existujú lepšie spôsoby ako sa robí, že iné ako duplikácia matice pre každý vrchol. Ja by som namiesto toho dať transformácie matice v SSBO:

layout(std430, binding=0) buffer Models {
    mat4 MV[]; // model-view matrices
};

a obchod jeden index v každom vrchole v VAO:

struct Vert {
    float x, y, r, g, b, a, u, v;
    int textureID, model;
};

Vertex shader môže ísť a priniesla plnú matice na základe indexu atribút:

layout(location = 0) in vec4 in_pos;
layout(location = 1) in int in_model;
void main() {
    gl_Position = MV[in_model] * in_pos;
}

Dokonca môžete kombinovať s ďalšími per-atribúty objektu, ako textureID.

EDIT: môžete dosiahnuť niečo podobné s instancing a multi-kresliť. Hoci je pravdepodobné, že bude pomalší.

2021-11-24 17:20:51

Môžete vypracovať viac o tom, čo presne model by byť? Snažím sa ho a som dostať len jeden objekt na obrazovke a myslím, že to je preto, že nie som odosielanie správne informácie.
Christopher Barrios Agosto

@ChristopherBarriosAgosto index modelu matice v MV pole: 0, 1, 2, atď...
Yakov Galka

Keďže ste vykresľovanie individuálne premenil štvorkolky, že bude 0,0,0,0,1,1,1,1,2,2,2,2,... ak ste poskytli s glDrawElements.
Yakov Galka

Som na to prišiel! Všetko funguje teraz! Ukazuje sa, že som bol okolo a tlmočenie indexy právo, ale bol som absolvovaní index ako plavák na GLSL, keď očakával int. Urobil som to dostať float a v GLSL obsadenie je na int a nie je interpretácii všetkých indexov právo. Mám to robiť týmto spôsobom, pretože vertex buffer je plavák typ. Ďakujem vám za všetko!
Christopher Barrios Agosto

@ChristopherBarriosAgosto: Gratulujem, že si na to prišiel. 'vertex buffer je plavák typ" -- vertex nárazníky sú postupnosti bajtov. Môžete uložiť structs tam s niektorými int polia a niektoré float polia.
Yakov Galka
0

Nie som si istý, ako sa váš kód motora skutočne vyzerá, ale predpokladám, že to vyzerá ako každý iný OpenGL program.

Ak áno, v mojej skúsenosti, transformovať matica by mala byť obyčajne prešiel na vertex shader, a uplatňujú sa s daným vertex informácie na GPU pri kreslení na scéne. Napríklad:

//MVP matrix
GLuint MatrixID = glGetUniformLocation(shaderProgID, "MVP");
glUniformMatrix4fv(MatrixID, 1, GL_FALSE, &mvp[0][0]);

Ale ak chcete nájsť svetové súradnice pre všetky vrcholy pre konkrétnu skupinu, mimo vykreslenie funkcie, budete pravdepodobne musieť urobiť na CPU, alebo budete musieť použiť niektoré paralelné programovanie techniky, ako napríklad OpenCL robiť prácu na GPU.

Najdôležitejšia vec je, prečo konkrétne chceš sveta súradnice informácie mimo kreslenie postup? Ak chcete jednoducho nájsť model sveta, súradnice, môžete jednoducho nastaviť centrum koordinátor pre každý model máte v scéne, a len sledovať, že jednotlivé súradnicové skôr ako celé oka skupiny.

Vertex informácie by mali byť vždy v modelových súradníc a uložené v vertex buffer s č touch, ak chcete použiť niektoré úpravy na nich.

2021-11-24 03:57:24

Ja som dávkovacia viacerými grafickými spolu. Preto nemôžem používať uniformy prejsť grafika' sa zmení, pretože som ich nebudete môcť zmeniť jednotné pre transformáciu medzi čerpať hovor. Avšak, verím, že pomocou SSBOs je veľmi dobrou alternatívou.
Christopher Barrios Agosto

V iných jazykoch

Táto stránka je v iných jazykoch

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................