2016-01-23 2 views
0

Я пытаюсь реализовать skybox, а затем использовать карту куба для skybox, чтобы сделать отражающую сферу в моей сцене, используя какой-то код, который я нашел для редактирования в соответствии с моим проектом. Skybox показывает, но изображение почти искажено, есть основной план гор, но нет цвета, как вы можете видеть на изображении. http://i.imgur.com/kJT4aCV.jpg Я пытался убедиться, что активная текстура и мои шейдеры правильные, но я просто не могу понять это.OpenGL Skybox render wrong

Vertex и пиксельный шейдер

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

нагрузки cubemap

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 компонентами на пиксель, но затем загружать ее в OpenGL как 3 компонента на пиксель, в результате каждый третий компонент интерпретируется как красный, а не альфа, или что-то вроде эти линии. – Alex

+0

Ты был прав! Я просто изменил его на image = stbi_load (faces [i], & width, & height, & numComponents, 3); и он исправил это, большое вам спасибо – thesyncer

+0

Рад помочь! – Alex

ответ

0

textu вновь был прочитан в, и подается в OpenGL с несовместимым числом компонентов на пиксель

image = stbi_load(faces[i], &width, &height, &numComponents, 4); читать в изображение с 4-х компонентов

Но когда вы кормили его OpenGL, glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image); вы кормили его в качестве текстуры с 3-х компонентов на каждый пиксель, заставляя каждые 4 байта интерпретироваться как красный, когда он должен был быть чем-то другим.