c++ - 对一个顶点缓冲对象 (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);
解决方案
虽然不是一个完整的答案,但我可以帮助调试。在我看来,纹理坐标是错误的(您没有提供填充它们的代码)。
在您的片段着色器中,我会将 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);
推荐阅读
- ruby-on-rails - 如何使用 devise_invitable 在现有记录上调用邀请资源
- spring-boot - 从异步回调返回 Mono/Flux
- javascript - 为什么这个 fetch promise-loader 没有显示结果
- python - 如何使用 openpyxl 在 python 中加载 excel 文件?
- python - 将对象从 VBA 或 Python 之类的解释语言传递给在不同 cpu 内核上运行的其他代码如何安全?
- java - 从 HostServices.showDocument 捕获 SecurityException
- javascript - 未捕获的 SyntaxError:意外标记:javascript 中的字符串文字。我不知道出了什么问题
- javascript - 如何编写表达式以在 Mapbox JS setFilter() 中输入多个值进行过滤?
- angular - 如何用茉莉花点击按钮元素?
- sql-server - MS SQL Server - 如果它匹配另一个视图中列中的多个条件,则更新表行