Как текстурировать несколько кубов в одном VBO (Vertex Buffer Object)? - PullRequest
0 голосов
/ 12 февраля 2019

Я создаю небольшой воксельный движок, и одна из оптимизаций, которые я нашел, заключается в создании только 1 VBO на блок.Каждый кусок содержит много кубиков.Но на самом деле моя текстура не повторяется должным образом для каждого куба, вот пример с 10 кубами: 10 cubes Как видите, только нижний левый куб хорошо текстурирован (вот в чем проблема)

Чтобы текстурировать кубы, я не использую 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);
...