2017-02-02 14 views
0

Я застрял, пытаясь понять эту штуку. Я пытаюсь создать skybox, но по какой-то причине независимо от того, что я делаю, моя карта куба всегда черная. В шейдере фрагмента, если я добавляю значение цвета вывода, например vec4 (1.0f), я вижу, что мой куб становится белым. Это заставило меня подумать, что это может быть загрузка по изображению, но я проверил это, и он отлично загружает изображение. Я уверен, что я просто глуп и что-то не хватает.Cube map black using shaders C++

Создание кубической карты

glGenTextures(1, &cube_texture); 
    glBindTexture(GL_TEXTURE_CUBE_MAP, cube_texture); 
    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); 

    LoadCubeMapFace(posX, GL_TEXTURE_CUBE_MAP_POSITIVE_X); 
    LoadCubeMapFace(negX, GL_TEXTURE_CUBE_MAP_NEGATIVE_X); 
    LoadCubeMapFace(posY, GL_TEXTURE_CUBE_MAP_POSITIVE_Y); 
    LoadCubeMapFace(negY, GL_TEXTURE_CUBE_MAP_NEGATIVE_Y); 
    LoadCubeMapFace(posZ, GL_TEXTURE_CUBE_MAP_POSITIVE_Z); 
    LoadCubeMapFace(negZ, GL_TEXTURE_CUBE_MAP_NEGATIVE_Z); 

Загрузка изображений с помощью SDL_image

 void LoadCubeMapFace(const std::string& filename, GLenum face) 
     { 
      SDL_Surface *imageSurface = IMG_Load((TEXTURE_PATH + filename).c_str()); 
      if (!imageSurface){ 

       std::cout << "Can't Load image " << filename << " " << IMG_GetError(); 
       return; 
      } 

      GLint nOfColors = imageSurface->format->BytesPerPixel; 

      GLenum textureFormat = GL_RGB; 
      GLenum internalFormat = GL_RGB8; 

      if (nOfColors == 4)     // contains an alpha channel 
      { 
       if (imageSurface->format->Rmask == 0x000000ff){ 
        textureFormat = GL_RGBA; 
        internalFormat = GL_RGBA8; 
       } 
       else 
       { 
        textureFormat = GL_BGRA; 
        internalFormat = GL_RGBA8; 
       } 
      } 
      else if (nOfColors == 3)     // no alpha channel 
      { 
       if (imageSurface->format->Rmask == 0x000000ff){ 
        textureFormat = GL_RGB; 
        internalFormat = GL_RGB8; 
       } 
       else 
       { 
        textureFormat = GL_BGR; 
        internalFormat = GL_RGB8; 
       } 
      } 
      else 
      { 
       std::cout << "ERROR [SDL_Surface -> Texture]: Image is not True Color" << std::endl; 
       return; 
      } 
      glTexImage2D(face, 0, internalFormat, imageSurface->w, imageSurface->h, 0, textureFormat, GL_UNSIGNED_BYTE, imageSurface->pixels); 

      SDL_FreeSurface(imageSurface); 
     } 

Rendering кубической карты

glActiveTexture(GL_TEXTURE0); 
    glBindTexture(GL_TEXTURE_CUBE_MAP, texture->GetTextureMap()); 
    GLint texture_uniform = glGetUniformLocation(Skybox::shader->GetShaderProgram(), "cube_map"); 
    glUniform1i(texture_uniform, 0); 

VS & FS шейдеры

#version 150 

    in vec3 vertex_position_model; 

    out vec3 the_uv; 

    uniform mat4 projection_matrix; 
    uniform mat4 view_matrix; 

    void main() 
    { 
     the_uv = vertex_position_model; 

     vec4 v = vec4(vertex_position_model, 1.0f); 
     gl_Position = projection_matrix * view_matrix * v; 
    } 


    #version 150 

    out vec4 FragColor; 

    in vec3 the_uv; 

    uniform samplerCube cube_map; 

    void main() 
    { 
     FragColor = texture(cube_map, the_uv); 
    } 

ответ

0

Я не уверен, в чем проблема, но, видимо, изображения, которые я использовал, работали неправильно. Открывая их с помощью paint.NET, а затем сохраняя их, поскольку 32-битное изображение глубины, похоже, решает проблему.

 Смежные вопросы

  • Нет связанных вопросов^_^