OpenGL: Lot de Rendu: Doit Transformations ont lieu sur le CPU ou GPU?

0

La question

Je développe un jeu en 2D moteur 3D de soutien dans l'avenir. Dans cette phase de développement, je suis en train de travailler sur le lot de moteur de rendu. Comme certains d'entre vous le savent, lorsque le dosage, les graphismes, un soutien uniforme de couleur (RGBA), les coordonnées de texture, texture ID (indice de la texture), et le modèle de matrice de transformation de sortir de la fenêtre, mais au lieu de cela sont passés à travers le vertex buffer. Maintenant, j'ai mis en œuvre en passant du modèle de positions, de couleur, de texture, de coordonnées et de l'IDENTIFIANT de la texture pour le vertex buffer. Mon vertex buffer format ressemble à ceci maintenant:

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

Je suis sur le point d'intégrer le calcul où l'objet doit être dans l'espace à l'aide d'une matrice de transformation. Cela m'amène à me poser la question:

Si la matrice de transformation, multiplié par le modèle de positions des sommets sur le CPU ou GPU?

Quelque chose à garder à l'esprit est que si je le passe à l'vertex buffer, je dois télécharger la matrice de transformation une fois par vertex (4 fois par sprite) qui me semble être un gaspillage de mémoire. D'autre part, en multipliant le modèle de positions des sommets par la matrice de transformation sur le CPU me semble qu'il serait plus lent comparativement avec le GPU de la simultanéité des capacités.

C'est ainsi que mon vertex buffer format pourrait ressembler si je fais le calcul de la transformation sur le 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};

La question est surtout théoriquement conduit. Donc, théorique et technique, la réponse devrait être très apprécié. Mais pour référence, voici le code.

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

La meilleure réponse

1

Devrait Transformations ont lieu sur le CPU ou GPU?

Cela dépend vraiment de la situation à portée de main. Si vous renvoyez votre les sommets de toutes les images, il est préférable de comparer ce qui est mieux pour votre cas. Si vous souhaitez animer sans renvoi de tous vos vertices, vous n'avez pas d'autre choix que de l'appliquer sur le GPU.

Quelle que soit la raison, si vous décidez d'appliquer des transformations sur le GPU, il y a de meilleures façons de faire que d'autres que de dupliquer la matrice pour chaque sommet. J'aurais plutôt mis les matrices de transformation dans un SSBO:

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

et de stocker un seul index de chaque sommet dans le VAO:

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

Le vertex shader peut aller chercher de la matrice complète basée sur l'attribut index:

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

Vous pouvez même combiner avec d'autres par les attributs de l'objet, comme l' textureID.

EDIT: vous pouvez obtenir quelque chose de similaire avec l'instanciation et multi-tirage. Si c'est susceptible d'être plus lente.

2021-11-24 17:20:51

Pouvez-vous élaborer davantage sur ce qu'est exactement le modèle serait? Je suis en train de le mettre en œuvre et n'en suis qu'à l'obtention d'une image-objet sur l'écran et pense que c'est parce que je ne suis pas envoyer la bonne information.
Christopher Barrios Agosto

@ChristopherBarriosAgosto un indice de la le modèle de la matrice dans le MV de tableau: 0, 1, 2 etc...
Yakov Galka

Puisque vous êtes rendu individuellement transformé quads, qui sera 0,0,0,0,1,1,1,1,2,2,2,2,... si vous rendre avec glDrawElements.
Yakov Galka

J'ai tout compris! Tout fonctionne maintenant! S'avère que j'ai été en passant et l'interprétation des indices de droit, mais j'ai été en passant l'index comme un flotteur pour GLSL quand il m'attendais à un int. J'en ai fait de recevoir un flotteur et GLSL convertir un int et non c'est l'interprétation de tous les indices de droit. - Je faire de cette façon parce que le vertex buffer est de type float. Je vous remercie pour tout!
Christopher Barrios Agosto

@ChristopherBarriosAgosto: Félicitations, vous avez compris. 'vertex buffer est de type float' -- vertex buffers sont des séquences d'octets. Vous pouvez stocker structs dans certains int champs et quelques float champs.
Yakov Galka
0

Je ne suis pas sûr de savoir comment votre code moteur ressemble vraiment, mais je suppose que ça ressemble à tout autre programme OpenGL.

Si donc, dans mon expérience, la matrice de transformation doit généralement être transmis pour le vertex shader et appliqué avec le même sommet des informations sur les GPU lorsque vous dessiner la scène. Par exemple:

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

Mais si vous voulez trouver les coordonnées de tous les sommets d'un groupe spécifique, en dehors de la fonction de rendu, vous avez probablement besoin de le faire sur le CPU, ou vous aurez besoin d'utiliser quelques techniques de programmation parallèle comme OpenCL pour faire le travail sur GPU.

La chose la plus importante est, pourquoi spécifiquement voulez-vous les coordonnées du monde de l'information à l'extérieur du dessin de la procédure? Si vous souhaitez simplement trouver le modèle de coordonnées du monde, vous pouvez simplement définir un centre de coordonnées pour chaque modèle vous avez de la scène et de ne suivre que seul coordonner plutôt que l'ensemble du groupe de mailles.

Le sommet de l'information doit toujours être en coordonnées de modèle et stockées dans un vertex buffer sans le toucher, à moins que vous souhaitez appliquer des modifications sur eux.

2021-11-24 03:57:24

Je suis le traitement par lots de plusieurs graphismes. Par conséquent, je ne peux pas utiliser les uniformes de passer graphiques' transforme, parce que je ne vais pas être en mesure de changer l'uniforme pour les transformer en entre appel. Cependant, je crois que l'aide SSBOs est une très bonne alternative.
Christopher Barrios Agosto

Dans d'autres langues

Cette page est dans d'autres langues

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