C++ 使用OpenGL显示两个对象。纹理的行为不符合预期

C++ 使用OpenGL显示两个对象。纹理的行为不符合预期,c++,textures,shader,opengl-3,C++,Textures,Shader,Opengl 3,您好,我正在尝试使用OpenGL显示两个对象,即:1)一个旋转立方体,前景中混合了两种纹理(一个木箱图案和一个笑脸),以及2)只有一种纹理(深灰色木材)作为背景的矩形板。当我注释掉控制矩形板显示的代码部分时,旋转立方体同时显示纹理(木箱和笑脸)。否则,立方体仅显示木箱纹理,深灰色木材纹理也显示在矩形板上,即笑脸纹理从旋转立方体中消失。请查找图像1)(代码的矩形板部分已注释)和2)(代码的矩形板部分未注释)。代码的相关部分粘贴在下面 关于这个代码,我有两个问题 为什么微笑消失了 这就是多个对

您好,我正在尝试使用OpenGL显示两个对象,即:1)一个旋转立方体,前景中混合了两种纹理(一个木箱图案和一个笑脸),以及2)只有一种纹理(深灰色木材)作为背景的矩形板。当我注释掉控制矩形板显示的代码部分时,旋转立方体同时显示纹理(木箱和笑脸)。否则,立方体仅显示木箱纹理,深灰色木材纹理也显示在矩形板上,即笑脸纹理从旋转立方体中消失。请查找图像1)(代码的矩形板部分已注释)和2)(代码的矩形板部分未注释)。代码的相关部分粘贴在下面

关于这个代码,我有两个问题

  • 为什么微笑消失了
  • 这就是多个对象的渲染方式吗?我知道OpenGL不关心对象,它只关心顶点,但在这种情况下,这些是独立的、不相交的对象。那么,我应该将它们组织为绑定到单个VAO的两个VBO,还是为每个对象分别绑定到两个VAO的单独VBO?或者是这样的情况,无论哪种方式都是好的-取决于程序员的选择和代码的优雅

您使用相同的着色器、相同的矩阵,并且两个对象(三角形)具有相同的几何体类型,那么为什么要设置着色器两次呢? 你有没有试过

  • 设置着色器
  • 绑定缓冲区#1
  • 绑定纹理#1
  • 绘制对象#1
  • 绑定缓冲区#2
  • 绑定纹理#2
  • 绘制对象#2
// Rotating Cube ===================================================
// Texture of wooden crate
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture1);
glUniform1i(glGetUniformLocation(ourShader_box.Program, "ourTexture1"), 0);

// Texture of a smiley
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, texture2);
glUniform1i(glGetUniformLocation(ourShader_box.Program, "ourTexture2"), 1);

// lets use the box shader for the cube
ourShader_box.Use();

// transformations for the rotating cube ---------------------------------
glm::mat4 model_box, model1, model2;
glm::mat4 view_box;
glm::mat4 perspective;

perspective = glm::perspective(45.0f, (GLfloat)width_screen/(GLfloat)height_screen, 0.1f, 200.0f);

model1 = glm::rotate(model_box, (GLfloat)glfwGetTime()*1.0f, glm::vec3(0.5f, 1.0f, 0.0f));
model2 = glm::rotate(model_box, (GLfloat)glfwGetTime()*1.0f, glm::vec3(0.0f, 1.0f, 0.5f));
model_box = model1 * model2;

view_box= glm::translate(view_box, glm::vec3(1.0f, 0.0f, -3.0f));

GLint modelLoc_box = glGetUniformLocation(ourShader_box.Program, "model");
GLint viewLoc_box = glGetUniformLocation(ourShader_box.Program, "view");
GLint projLoc_box = glGetUniformLocation(ourShader_box.Program, "perspective");

glUniformMatrix4fv(modelLoc_box, 1, GL_FALSE, glm::value_ptr(model_box));
glUniformMatrix4fv(viewLoc_box, 1, GL_FALSE, glm::value_ptr(view_box));
glUniformMatrix4fv(projLoc_box, 1, GL_FALSE, glm::value_ptr(perspective));  
// --------------------------------------------------------------------

// Draw calls
glBindVertexArray(VAO_box);
glDrawArrays(GL_TRIANGLES, 0, 36);
glBindVertexArray(0);

// Rectangular Plate =====================================================
// Background Shader
ourShader_bg.Use();

// Texture of dark grey wood
glActiveTexture(GL_TEXTURE2);
glBindTexture(GL_TEXTURE_2D, texture_wood);
glUniform1i(glGetUniformLocation(ourShader_bg.Program, "ourTexture3"), 2);

// Transformations -------------------------------------------
glm::mat4 model_bg;
glm::mat4 view_bg;

GLint modelLoc_bg = glGetUniformLocation(ourShader_bg.Program, "model");
GLint viewLoc_bg= glGetUniformLocation(ourShader_bg.Program, "view");
GLint projLoc_bg = glGetUniformLocation(ourShader_bg.Program, "perspective");

glUniformMatrix4fv(modelLoc_bg, 1, GL_FALSE, glm::value_ptr(model_bg));
glUniformMatrix4fv(viewLoc_bg, 1, GL_FALSE, glm::value_ptr(view_bg));
glUniformMatrix4fv(projLoc_bg, 1, GL_FALSE, glm::value_ptr(perspective));   
// -----------------------------------------------------------

// Draw calls
glBindVertexArray(VAO_bg);
glDrawArrays(GL_TRIANGLES, 0, 6);
glBindVertexArray(0);
// =================================================================