OpenGL: Wsadowy wizualizer: czy konwersji wykonywany na procesorze lub graficznej, procesorze?

0

Pytanie

Zajmuję się tworzeniem grafiki 2D-silnik gry, który w przyszłości będzie obsługiwać 3D. Na tym etapie rozwoju pracuję nad środkiem packet wizualizacji. Jak niektórzy z was może wiedzą, podczas łączenia grafiki w pakiety jedna wsparcie kolory (RGBA), współrzędne tekstury, identyfikator tekstury (indeks tekstury) i macierz transformacji modelu wychodzą z okna, ale zamiast tego są przekazywane przez bufor wierzchołków. Teraz osiągnąłem transfer pozycji modelu, koloru, współrzędnych tekstury i identyfikatora tekstury do bufora wierzchołków. Mój rozmiar bufora wierzchołków teraz wygląda tak:

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};

Mam zamiar zintegrować obliczenie tego, gdzie obiekt musi znajdować się w globalnej przestrzeni, wykorzystując macierz transformacji. To sprawia, że zadać pytanie:

Czy macierz przekształcenia być pomnożona, na pozycji wierzchołków modelu procesora lub procesorów kart graficznych?

Należy pamiętać, że jeśli przekażę go do bufora wierzchołków, będę musiał pobierać macierz transformacji raz na szczyt (4 razy na ikonkę), co wydaje mi się stratą pamięci. Z drugiej strony, mnożenie pozycji wierzchołków modelu w macierz transformacji na procesorze wydaje się wolniejszy w porównaniu z możliwościami równoległości procesora graficznego.

Oto, jak będzie wyglądać mój rozmiar bufora wierzchołków, jeśli вычислю konwersja na procesorze graficznym:

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};

To pytanie głównie spowodowany teoretycznie. W ten sposób teoretyczny i techniczny odpowiedź był bym bardzo wdzięczny. Ale dla przypomnienia, oto kod.

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

Najlepsza odpowiedź

1

Czy konwersji odbywać się na procesorze lub graficznej, procesorze?

To naprawdę zależy od aktualnej sytuacji. Jeśli ponownie wysłać swoje szczyty każda klatka, najlepiej jest ustalić, co najlepiej pasuje do twojego przypadku. Jeśli chcesz animować bez ponownego wysyłania wszystkich szczytów, nie masz wyboru, jak tylko zastosować go na procesorze graficznym.

Jaka by nie była przyczyna, jeśli zdecydujesz się zastosować konwersji na procesorze graficznym, są lepsze sposoby, aby to zrobić, oprócz powielania macierzy dla każdego wierzchołka. Zamiast tego bym umieścił macierzy przekształceń w SSBO:

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

i przechowywać jeden indeks w każdej szczycie w VAO:

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

Вершинный moduł cieniujący może przejść i uzyskać pełną matrycę na podstawie atrybutu indeksu:

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

Można nawet połączyć go z innymi atrybutami dla każdego obiektu, takich jak textureID.

EDYCJA: można zrobić coś takiego za pomocą tworzenia wystąpień i wielokrotnego rysowania. Choć, prawdopodobnie, to będzie wolniej.

2021-11-24 17:20:51

Czy możesz powiedzieć coś więcej o tym, jaki będzie model? Staram się realizować to i pojawia się tylko jedna ikonka na ekranie i myślę, że to dlatego, że wysyłam nieprawdziwe informacje.
Christopher Barrios Agosto

@ChristopherBarriosAgosto indeks macierzy modelu w tablicy MV: 0, 1, 2 Itd.
Yakov Galka

Ponieważ визуализируете indywidualnie przekonwertowane quady, to będzie 0,0,0,0,1,1,1,1,2,2,2,2,... jeśli визуализируете z pomocą glDrawElements.
Yakov Galka

Ja wszystko rozumiem! Teraz wszystko działa! Okazuje się, że poprawnie przekazywał i interpretował indeksy, ale nie przekazywał indeks w postaci pływaka w GLSL, gdy spodziewał się, int. Kazałem mu uzyskać pływak i w GLSL doprowadzić go do int, a nie do prawidłowej interpretacji wszystkich indeksów. Muszę to zrobić w ten sposób, bo bufor wierzchołków jest typu float. Dziękuję ci za wszystko!
Christopher Barrios Agosto

@ChristopherBarriosAgosto: Gratuluję, że pan to rozumie. "bufor wierzchołków ma typ liczba zmiennoprzecinkowa" - bufory wierzchołków stanowią sekwencje bajtów. Można przechowywać structs tam z jakimś int pola i niektóre float pola.
Yakov Galka
0

Nie jestem pewien, jak właściwie wygląda twój kod silnika, ale myślę, że wygląda jak każdy inny program OpenGL.

Jeśli tak, to z mojego doświadczenia, macierz transformacji zwykle należy przesyłać w вершинный cieniowanie i stosować z podaną informacją o wierzchołkach na procesorze graficznym podczas rysowania sceny. Na przykład:

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

Ale jeśli chcesz znaleźć światowych współrzędne wszystkich wierzchołków dla określonej grupy poza funkcje renderowania, prawdopodobnie będziesz musiał zrobić to na procesorze, czy trzeba będzie korzystać z niektórych technik programowania równoległego, takich jak OpenCL, do wykonywania pracy na GPU.

Najważniejsze, dlaczego potrzebujesz informacji o światowych współrzędnych na zewnątrz procedury rysowania? Jeśli chcesz po prostu znaleźć światowych współrzędne modelu, można po prostu ustawić środkową współrzędną dla każdego modelu, który posiadasz w scenie, i śledzić tylko tę jedyną współrzędną, a nie całą grupę siatek.

Informacje o szczytach zawsze musi być w układzie współrzędnych modelu i być przechowywane w buforze wierzchołków bez dotyku, jeśli tylko nie chcesz zastosować do nich jakieś zmiany.

2021-11-24 03:57:24

Zbieram kilka wykresów razem. Dlatego nie mogę używać mundurów dla transmisji przekształceń grafiki, bo nie mogę zmienić mundur do konwersji między połączeniami rysowania. Tym nie mniej, uważam, że korzystanie z SSBOs-bardzo dobra alternatywa.
Christopher Barrios Agosto

W innych językach

Ta strona jest w innych językach

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