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