Повторить UV для нескольких кубов в одном объекте буфера вершин (VBO)? - PullRequest
0 голосов
/ 08 февраля 2019

Я делаю маленький воксельный движок, используя систему чанков (как в Minecraft).Я решил сделать 1 VBO на чанк, поэтому VBO содержит несколько кубов, которые будут использовать разные текстуры.

У меня фактически есть UV куба, и я хотел бы использовать его на всех кубах в VBO, так чтоТекстура обернет все кубы одинаково, если кубы были в отдельных VBO.

Вот что я на самом деле получаю:

actual result

Как заставить OpenGL делать то же самое, что и первый куб на всех кубах?

РЕДАКТИРОВАТЬ: вот мои шейдеры: вершинный шейдер #version 400

layout(location = 0) in vec3 vertexPosition_modelspace;
layout(location = 1) in vec2 vertexUV;

out vec2 UV;

uniform mat4 MVP;

void main() {
    gl_Position = MVP * vec4(vertexPosition_modelspace, 1);
    UV = vertexUV;
}

фрагментshader

#version 400

in vec2 UV;

out vec3 color;

uniform sampler2D textureSampler;

void main(){
  color = texture(textureSampler, UV).rgb;
}

мой цикл glfw:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glUseProgram(programID);
glUniformMatrix4fv(MatrixID, 1, GL_FALSE, &chunkHandler.player.mvp[0][0]);

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, grass);
glUniform1i(textureID, 0);

glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, chunkHandler.loaded_chunks[0]->vboID);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);

glEnableVertexAttribArray(1);
glBindBuffer(GL_ARRAY_BUFFER, tboID);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, (void*)0);

glDrawArrays(GL_TRIANGLES, 0, chunkHandler.loaded_chunks[0]->nbVertices);

glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);

glfwSwapBuffers(window);
glfwPollEvents();

tboID: tbo для объекта текстурного буфера

как создать TBO:

glGenBuffers(1, &tboID);
    glBindBuffer(GL_ARRAY_BUFFER, tboID);
    glBufferData(GL_ARRAY_BUFFER, 36 * 2 * sizeof(float), uvcube, GL_STATIC_DRAW);

1 Ответ

0 голосов
/ 08 февраля 2019

Пока не полный ответ, я могу помочь в отладке.Мне кажется, что координаты текстуры неверны (вы не предоставляете код для их заполнения).

В вашем фрагментном шейдере я бы вывел координаты U и V в виде цветов:

#version 400

in vec2 UV;

out vec3 color;

uniform sampler2D textureSampler;

void main(){
  color = vec3(UV.u, UV.v, 0);
}

Если координаты верны, у вас должен быть градиент на каждой грани куба (каждая вершина куба будет окрашена в зависимости от его UV, поэтому (0,0) вершина черная, а (0,1) зеленая искоро).Если это не так, попробуйте исправить значение текстуры, пока вы не увидите их правильно.

Мне это кажется подозрительным: glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, (void*)0);

...