Я пытаюсь реализовать 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);
Позвольте мне знать, если какие-либо другие части было бы полезно, чтобы увидеть
Я сам начинаю с OpenGL, поэтому я, вероятно, ошибаюсь, но это выглядит как несоответствие текстуры был прочитан и как OpenGL интерпретирует его. Я никогда не использовал stb, но похоже, что вы можете читать текстуру с 4 компонентами на пиксель, но затем загружать ее в OpenGL как 3 компонента на пиксель, в результате каждый третий компонент интерпретируется как красный, а не альфа, или что-то вроде эти линии. – Alex
Ты был прав! Я просто изменил его на image = stbi_load (faces [i], & width, & height, & numComponents, 3); и он исправил это, большое вам спасибо – thesyncer
Рад помочь! – Alex