OpenGL:天空盒/立方体贴图仅部分显示,缺少三角形

时间:2019-06-01 10:17:24

标签: opengl textures skybox

我尝试按照本教程创建带纹理的天空盒: cubemaps。盒子的某些三角形(已三角化)根本没有显示,但奇怪的是,没有每个正方形的第二个三角形丢失(1个正方形的纹理正确)。我的问题可以在下面的图片中看到。浅灰色是场景的“一般”颜色,与天窗无关。

enter image description here

enter image description here

我相信问题是由其中一个着色器引起的,当我得到

  

无效操作

错误,同时尝试使用天空盒的着色器。可能是什么问题?

这里是顶点着色器的代码:

#version 330 core
layout (location = 0) in vec3 aPos;

out vec3 TexCoords;

uniform mat4 projection;
uniform mat4 view;

void main() {
    TexCoords = aPos;
    vec4 pos = projection * view * vec4(aPos, 1.0);
    gl_Position = pos.xyww;
}  

和片段着色器:

#version 330 core
out vec4 FragColor;

in vec3 TexCoords;

uniform samplerCube skybox;

void main() {    
    FragColor = texture(skybox, TexCoords);
}

最后是加载立方体贴图的过程:

GLuint loadCubemap(std::vector<std::string> faces) {
  GLuint textureID;
  glGenTextures(1, &textureID);
  glBindTexture(GL_TEXTURE_CUBE_MAP, textureID);

  int width, height, nrChannels;
  for (GLuint i = 0; i < faces.size(); i++) {
    unsigned char *data = stbi_load(faces[i].c_str(), &width, &height, &nrChannels, 0);
    if (data) {
      glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i,
               0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
      stbi_image_free(data);
    } else {
      std::cout << "Cubemap texture failed to load at path: " << faces[i] << std::endl;
      stbi_image_free(data);
    }
  }
  glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
  glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);

  return textureID;
}

1 个答案:

答案 0 :(得分:1)

我发现了问题!这不是由着色器引起的,而是由我自己的愚蠢引起的。在主渲染循环中,我忘了在新插入的VAO缓冲区+绘制三角形对之后删除额外的绑定VAO缓冲区+绘制三角形。