Я пытаюсь создать скайбокс для проекта в OpenGL 3.3
, Проект написан на C ++. Проблема, которая у меня есть, несмотря на загрузку текстуры карты куба и привязку сэмплера, я получаю черные пиксели, как на картинке (куб имеет нормали, направленные внутрь него):
цвет из сэмплера
Это проблема с тем, что я делаю с сэмплером, потому что когда я использую координаты вершины в качестве цвета, это прекрасно работает:
цвет из постинга
Я искал похожие проблемы, но ни один из ответов не помог мне.
Вот интересные части кода:
#version 330 core
layout (location = 0) in vec3 position;
out vec3 TexCoords;
uniform mat4 mvp;
void main()
{
gl_Position = mvp * vec4(position, 1.0);
TexCoords = position;
}
#version 330 core
in vec3 TexCoords;
out vec4 color;
uniform samplerCube skybox;
void main()
{
color = texture(skybox, TexCoords);
}
CubeTexture::CubeTexture(GLenum texture, std::vector<const GLchar*> faces)
{
this->texture = texture;
glGenTextures(1, &texture_id);
glActiveTexture(texture);
int width, height;
unsigned char* image;
glBindTexture(GL_TEXTURE_CUBE_MAP, texture_id);
for(GLuint i = 0; i < faces.size(); i++)
{
image = SOIL_load_image(faces[i], &width, &height, 0, SOIL_LOAD_RGB);
if (image == nullptr)
throw std::runtime_error(std::string("Failed to load texture file"));
glTexImage2D(
GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0,
GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, 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);
}
void CubeTexture::bind(GLuint shader_program_id, const char* name, unsigned int location)
{
glActiveTexture(texture);
glBindTexture(GL_TEXTURE_CUBE_MAP, texture_id);
glUniform1i(glGetUniformLocation(shader_program_id, name), location);
}
// ...
std::vector<const GLchar*> faces;
faces.push_back("res/textures/skybox/right.png");
faces.push_back("res/textures/skybox/left.png");
faces.push_back("res/textures/skybox/top.png");
faces.push_back("res/textures/skybox/bottom.png");
faces.push_back("res/textures/skybox/back.png");
faces.push_back("res/textures/skybox/front.png");
CubeTexture skybox_texture(GL_TEXTURE0, faces);
// ... in the main loop ...
glUseProgram(skybox_program_id);
skybox_texture.bind(skybox_program_id, "skybox", 0);
Задача ещё не решена.
Других решений пока нет …