OpenGL 4.3 - CubeMap работает только когда привязан как GL_TEXTURE_2D
Я пытаюсь реализовать скайбокс в открытом гл. Это не сработает, если я не свяжу это как GL_TEXTURE_2D
Вот как я загружаю свою карту куба:
// http://www.antongerdelan.net/opengl/cubemaps.html
void SkyBoxMaterial::CreateCubeMap(const char* front, const char* back, const char* top, const char*bottom, const char* left, const char*right, GLuint *tex_cube){
glGenTextures(ONE, tex_cube);
assert(LoadCubeMapSide(*tex_cube, GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, front));
assert(LoadCubeMapSide(*tex_cube, GL_TEXTURE_CUBE_MAP_POSITIVE_Z, back));
assert(LoadCubeMapSide(*tex_cube, GL_TEXTURE_CUBE_MAP_POSITIVE_Y, top));
assert(LoadCubeMapSide(*tex_cube, GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, bottom));
assert(LoadCubeMapSide(*tex_cube, GL_TEXTURE_CUBE_MAP_NEGATIVE_X, left));
assert(LoadCubeMapSide(*tex_cube, GL_TEXTURE_CUBE_MAP_POSITIVE_X, right));
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_R, GL_CLAMP_TO_EDGE);
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);
checkGLErrors("SKYBOX_MATERIAL::CreateCubeMap", "END"); }
В приведенном ниже фрагменте я связываю текстуру в виде карты куба. Это не работает! Я получил черный квадрат. Однако, если бы я связал его с GL_TEXTURE_2D, я получил бы текстурированный куб (?).
bool SkyBoxMaterial::LoadCubeMapSide(GLuint texture, GLenum side_target, const char* fileName){
glBindTexture(GL_TEXTURE_CUBE_MAP, texture);
int width, height, n;
int force_channels = 4;
unsigned char* image_data = stbi_load(fileName, &width, &height, &n, force_channels);
glTexImage2D(side_target, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, image_data);
glBindTexture(GL_TEXTURE_CUBE_MAP, 0);
free(image_data);
return true;
}
Рендеринг моего материала:
void SkyBoxMaterial::Draw(){
glDepthMask(GL_FALSE);
glUseProgram(programID);
glBindVertexArray(VAO);
glActiveTexture(GL_TEXTURE0);
glUniform1i(glGetUniformLocation(programID, "skybox"), 0);
glBindTexture(GL_TEXTURE_CUBE_MAP, cubeMapTexture);
glDrawArrays(geometry->getDrawMode(), 0, geometry->getNumVertices());
glBindVertexArray(CLEAR);
glUseProgram(CLEAR);
glDepthMask(GL_TRUE);
}
Мой вершинный шейдер:
#version 430 core
uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;
layout (location = 0) in vec3 gl_vertex;
out vec3 texcoords;
void main(){
vec4 homogeneous_vertecies = vec4(gl_vertex,1.0);
gl_Position = projection*view*model*homogeneous_vertecies;
texcoords = gl_vertex;
}
Фрагмент шейдера:
#version 430 core
in vec3 texcoords;
uniform samplerCube skybox;
// Ouput data
out vec4 color;
void main(){
color = texture(skybox,texcoords);
}
Я не знаком с OpenGl. Это может быть проблема с пометкой?
Это единственные 3 флага, которые я установил в начале.
glEnable(GL_DEPTH_TEST);
// Cull triangles which normal is not towards the camera
glEnable(GL_CULL_FACE);
// Accept fragment if it closer to the camera than the former one
glDepthFunc(GL_LESS);
Не знаю, что здесь делать. Это кажется мне очень неясным. Спасибо! Марк