Я создаю небольшой воксельный движок, и одна из оптимизаций, которые я нашел, заключается в создании только 1 VBO на блок.Каждый кусок содержит много кубиков.Но на самом деле моя текстура не повторяется должным образом для каждого куба, вот пример с 10 кубами:
Как видите, только нижний левый куб хорошо текстурирован (вот в чем проблема)
Чтобы текстурировать кубы, я не использую UV-отображение, я вычисляю позиции текстуры в шейдерах, используя OpenGL-отображение кубов.
Вот мои шейдеры: vertex shader:
#version 400
layout(location = 0) in vec3 vertexPosition_modelspace;
out vec3 textureDir;
uniform mat4 MVP;
void main() {
gl_Position = MVP * vec4(vertexPosition_modelspace, 1);
textureDir = vertexPosition_modelspace;
}
фрагментный шейдер:
#version 400
in vec3 textureDir;
out vec3 color;
uniform samplerCube textureSampler;
void main(){
color = texture(textureSampler, textureDir).rgb;
}
Вот как я могу создать свою текстуру:
glGenTextures(1, &texture_id);
glBindTexture(GL_TEXTURE_CUBE_MAP, texture_id);
for (GLint i = 0; i < 6; i++)
glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_RGB, width, height, 0, GL_BGR,
GL_UNSIGNED_BYTE, data);
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);