对一个顶点缓冲对象(VBO)中的多个立方体重复UV?

时间:2019-02-08 17:33:20

标签: c++ opengl glfw voxel

我正在使用块系统(如在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;
}

片段着色器

#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 :(得分:0)

虽然没有完整的答案,但我可以帮助调试。 在我看来,纹理坐标是错误的(您没有提供填充它们的代码)。

在您的片段着色器中,我将U和V坐标输出为颜色:

<ul id="todosContainer"></ul>

如果坐标正确,则每个立方体面上都应有一个渐变(每个立方体顶点将根据其UV着色,因此(0,0)顶点为黑色,而(0,1)顶点为绿色,因此上)。 如果不是这种情况,请尝试修复纹理值,直到可以正确看到它们为止。

这对我来说似乎很可疑:#version 400 in vec2 UV; out vec3 color; uniform sampler2D textureSampler; void main(){ color = vec3(UV.u, UV.v, 0); }