2016-01-23 113 views
0

我想實現一個天空盒,然後使用天空盒的立方體貼圖在我的場景中使用一些代碼來製作反射球體,這些代碼是爲了適合我的項目而編輯的。天空盒顯示,但圖像幾乎損壞看,有一個山的基本輪廓,但沒有顏色,你可以在圖像中看到。 http://i.imgur.com/kJT4aCV.jpg 我一直在努力確保活動紋理和着色器是正確的,但我無法弄清楚。OpenGL Skybox渲染錯誤

頂點和片段着色器

#version 330 core 
layout (location = 0) in vec3 position; 
out vec3 TexCoords; 

uniform mat4 projection; 
uniform mat4 view; 


void main() 
{ 
    vec4 pos = projection * view * vec4(position, 1.0); 
    gl_Position = pos.xyww; 
    TexCoords = position; 
} 
#version 330 core 
in vec3 TexCoords; 
out vec4 color; 

uniform samplerCube skybox; 

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

加載立方體貼圖

GLuint loadCubemap(std::vector<const GLchar*> faces) 
{ 
    GLuint textureID; 
    glGenTextures(1, &textureID); 

    int width, height, numComponents; 
    unsigned char* image; 

    glBindTexture(GL_TEXTURE_CUBE_MAP, textureID); 
    for (GLuint i = 0; i < faces.size(); i++) 
    { 
     image = stbi_load(faces[i], &width, &height, &numComponents, 4); 
     glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image); 
     stbi_image_free(image); 
    } 
    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_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); 
    glBindTexture(GL_TEXTURE_CUBE_MAP, 0); 

    return textureID; 
} 

繪製天空盒

  glDepthFunc(GL_LEQUAL); 
      skyShader.Bind(); 
      skyShader.Update(transform, camera); 
      view = glm::mat4(glm::mat3(camera.GetViewProjection())); 
      glUniformMatrix4fv(glGetUniformLocation(skyShader.getProg(), "view"), 1, GL_FALSE, glm::value_ptr(view)); 
      glUniformMatrix4fv(glGetUniformLocation(skyShader.getProg(), "projection"), 1, GL_FALSE, glm::value_ptr(projection)); 

      glBindVertexArray(skyboxVAO); 
      glActiveTexture(GL_TEXTURE0); 
      glUniform1i(glGetUniformLocation(skyShader.getProg(), "skybox"), 0); 
      glBindTexture(GL_TEXTURE_CUBE_MAP, skyboxTexture); 
      glDrawArrays(GL_TRIANGLES, 0, 36); 
      glBindVertexArray(0); 
      glDepthFunc(GL_LESS); 

讓我知道如果任何其他部分將看到

+0

我是OpenGL自己的初學者,所以我可能很有可能是錯的,但這看起來像紋理的不匹配被讀入,以及OpenGL如何解釋它。我從來沒有用過stb,但是看起來你可能會在每個像素有4個分量的紋理中讀取數據,但隨後將它作爲每個像素3個分量輸入到OpenGL中,導致每個第三個分量被解釋爲紅色而不是alpha,或者沿着某個方向那些線。 – Alex

+0

你完全正確!我只是將其更改爲image = stbi_load(faces [i],&width,&height,&numComponents,3);它修好了,非常感謝你 – thesyncer

+0

很高興幫助! – Alex

回答

0

將是有益的textu再被讀入,並送入與4個分量

但是,當你饋送它到OpenGL,glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image);你供給它作爲與3個分量的紋理數每圖像中讀取的像素

image = stbi_load(faces[i], &width, &height, &numComponents, 4);部件的不一致到OpenGL每個像素,導致每4個字節被解釋爲紅色時,它應該是別的東西