首页 > 解决方案 > 对一个顶点缓冲对象 (VBO) 中的多个立方体重复 UV?

问题描述

我正在使用块系统(如在 Minecraft 中)制作一个小体素引擎。我决定为每个块制作 1 个 VBO,因此 VBO 包含多个将使用不同纹理的立方体。

我实际上有一个立方体的 UV,我想在 VBO 中的所有立方体上使用它,因此如果立方体位于分离的 VBO 中,纹理将以相同的方式包裹所有立方体。

这是我实际得到的:

实际结果

如何告诉 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);

标签: c++openglglfwvoxel

解决方案


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

在您的片段着色器中,我会将 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);


推荐阅读