Dessin d’objects multiples (OpenGL)

Le problème est que je ne peux pas comprendre comment dessiner correctement deux objects, car mon autre object n’est pas dessiné.

Voici le code principal:

GLuint VertexArrayID; glGenVertexArrays(1, &VertexArrayID); glBindVertexArray(VertexArrayID); GLuint VertexArrayID2; glGenVertexArrays(1, &VertexArrayID2); glBindVertexArray(VertexArrayID2); GLuint programID = LoadShaders( "SimpleVertexShader.vertexshader", "SimpleFragmentShader.fragmentshader" ); GLuint MasortingxID = glGetUniformLocation(programID, "MVP"); GLuint MasortingxID2 = glGetUniformLocation(programID, "MVP2"); glm::mat4 Projection = glm::perspective(45.0f, 5.0f / 4.0f, 0.1f, 100.0f); glm::mat4 View = glm::lookAt( glm::vec3(4*2,3*2,8*2), glm::vec3(0,0,0), glm::vec3(0,1,0) ); glm::mat4 Model = glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.0f, 0.0f)); glm::mat4 MVP = Projection * View * Model; glUniformMasortingx4fv(MasortingxID, 1, GL_FALSE, &MVP[0][0]); glm::mat4 Model2 = glm::translate(glm::mat4(1.0f), glm::vec3(-5.0f, 0.0f, 0.0f)); glm::mat4 MVP2 = Projection * View * Model2; glUniformMasortingx4fv(MasortingxID2, 1, GL_FALSE, &MVP2[0][0]); static const GLfloat g_vertex_buffer_data[] = { -1.0f,-1.0f,-1.0f, -1.0f,-1.0f, 1.0f, (plenty of floats) 1.0f,-1.0f, 1.0f }; static const GLfloat g_vertex_buffer_data2[] = { -1.0f, -1.0f, 3.0f, (plenty of floats) 0.0f, 1.0f, 2.0f, }; GLuint vertexbuffer; glGenBuffers(1, &vertexbuffer); glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer); glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data), g_vertex_buffer_data, GL_STATIC_DRAW); GLuint vertexbuffer2; glGenBuffers(1, &vertexbuffer2); glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer2); glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data2), g_vertex_buffer_data2, GL_STATIC_DRAW); do{ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glUseProgram(programID); glUniformMasortingx4fv(MasortingxID, 1, GL_FALSE, &MVP[0][0]); glUniformMasortingx4fv(MasortingxID2, 1, GL_FALSE, &MVP2[0][0]); glEnableVertexAtsortingbArray(0); glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer); glVertexAtsortingbPointer(0,3,GL_FLOAT,GL_FALSE,0,(void*)0); glDrawArrays(GL_TRIANGLES, 0, 12*3); glEnableVertexAtsortingbArray(2); glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer2); glVertexAtsortingbPointer(2,3,GL_FLOAT,GL_FALSE,0,(void*)0); glDrawArrays(GL_TRIANGLES, 0, 4*3); glDisableVertexAtsortingbArray(0); glDisableVertexAtsortingbArray(2); glfwSwapBuffers(window); glfwPollEvents(); } 

Et shader:

 layout(location = 0) in vec3 vertexPosition_modelspace; layout(location = 2) in vec3 vertexPosition_modelspace2; uniform mat4 MVP; uniform mat4 MVP2; void main(){ gl_Position = MVP * vec4(vertexPosition_modelspace,1); gl_Position = MVP2 * vec4(vertexPosition_modelspace2,1); } 

J’ai remarqué que seul le dernier object est dessiné. Le problème est que ‘gl_Position’ écrase ses valeurs, mais comment dois-je le comprendre?

 gl_Position = MVP * vec4(vertexPosition_modelspace,1); gl_Position = MVP2 * vec4(vertexPosition_modelspace2,1); 

Ce n’est pas ainsi que fonctionne le pipeline graphique. Vous ne pouvez pas dessiner deux objects en même temps. gl_Position la dernière écriture sur gl_Position sera effective et votre premier object sera complètement ignoré. Dans la variante la plus élémentaire, vous souhaitez dessiner deux objects complètement indépendants et vous aurez besoin de deux appels de dessin pour cela – comme vous le faites dans votre code.

Cependant, pour ce faire, vous n’avez pas besoin de deux atsortingbuts de sumt différents pour cela. Votre shader ne traite que les vertiments, qui dans votre cas ne possèdent que l’atsortingbut verexPosition_modelspace . Vous pouvez donc utiliser cet atsortingbut pour tous les objects que vous voulez dessiner. Il est inutile d’utiliser des atsortingbuts différents pour des objects différents si l’atsortingbut signifie la même chose.

Jetons un coup d’oeil à votre code de dessin:

 glEnableVertexAtsortingbArray(0); glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer); glVertexAtsortingbPointer(0,3,GL_FLOAT,GL_FALSE,0,(void*)0); 

Ici, vous configurez l’atsortingbut de sumt 0 pour qu’il pointe vers les données de sumt du premier tampon et vous activez le tableau d’atsortingbut. Les données ne seront donc pas utilisées comme source pour vertexPosition_modelspace .

 glDrawArrays(GL_TRIANGLES, 0, 12*3); 

Maintenant, vous dessinez l’object. Mais comme nous l’avons déjà vu, votre shader n’utilise réellement que vertexPosition_modelspace2 , pour lequel vous n’avez pas défini de pointeur ni activé le tableau. Comme le tableau est déséquilibré, le GL utilisera la valeur actuelle de l’atsortingbut 2 – pour tous les sumts. Ainsi, dans le cas de sortingangles, vous créez des sortingangles avec tous les points identiques, obtenant ainsi des sortingangles dont la surface est 0 et qui sont invisibles, quelle que soit la valeur de l’atsortingbut 2 actuel.

 glEnableVertexAtsortingbArray(2); glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer2); glVertexAtsortingbPointer(0,3,GL_FLOAT,GL_FALSE,0,(void*)0); 

Maintenant, vous faites une chose étrange: vous activez le tableau d’atsortingbut 2, mais ne définissez pas de pointeur pour celui-ci! Vous devez spécifier le pointeur de l’atsortingbut 0 pour qu’il pointe vers votre deuxième modèle.

 glDrawArrays(GL_TRIANGLES, 0, 4*3); 

Maintenant, vous dessinez avec les atsortingbuts 0 et 2 activés. L’atsortingbut 0 contiendra les données souhaitées, mais sera ignoré par le shader. L’atsortingbut 2 indique un comportement indéfini – il risque de tomber en panne, mais il peut également afficher des éléments étranges ou rien du tout.

Pour que cela fonctionne, il suffit de supprimer vertexPosition_modelspace2 du shader. Utilisez juste une masortingce MVP également. Lorsque vous dessinez un object, vous devez:

  1. Définir la masortingce uniforme MVP pour l’object
  2. Définir le pointeur d’atsortingbut pour l’atsortingbut 0
  3. Activez le tableau d’atsortingbuts pour l’atsortingbut 0 (ou assurez-vous qu’il est déjà activé)
  4. Émettre le tirage au sort

Vous pouvez le faire avec autant d’objects que vous le souhaitez.