当前位置: 首页 > 知识库问答 >
问题:

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

白烨煜
2023-03-14

我正在使用区块系统(如Minecraft)制作一个小体素引擎。我决定每个区块制作一个VBO,这样VBO就包含了多个使用不同纹理的立方体。

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

以下是我实际得到的信息:

如何告诉OpenGL在所有多维数据集上执行与第一个多维数据集相同的操作?

编辑:这里是我的着色器:顶点着色器#版本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个答案

须原
2023-03-14

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

在片段着色器中,我将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)为绿色,依此类推)。如果不是这样,请尝试固定纹理值,直到您可以正确看到它们。

这看起来很可疑:glvertexattributepointer(1,2,GL_FLOAT,GL_FALSE,0,(void*)0)

 类似资料:
  • 我正在尝试从ArrayList读取并创建VBO,然后对其进行渲染。问题是我只是渲染了一个空白屏幕。当我立即渲染时,一切都很好;只有现在VBO的才不起作用。 游戏循环如下所示,相机调用glTranslate和glRotate函数。 渲染方法: 阵列列表具有顶点和链接的颜色。每个体素将其顶点添加到ArrayList(而不是立即渲染)。

  • 我目前正在使用LWJGL / OpenGL创建一个2D,自上而下的游戏,但是在绘制实体之后,在使用顶点缓冲区对象渲染实体后,在让它们四处移动的过程中,我遇到了一些问题。这是渲染线程的 run() 方法,以及设置方法: 实体从抽象超类继承这些方法来设置 VBO 并绘制实体(呈现线程中的 drawEntities 方法仅调用该方法,实体更新方法(见下文),而 setUpEntities 调用 setU

  • 我正在努力理解这两个,如何使用它们,以及它们是如何联系的。假设我想创建一个简单的地形和一个有纹理的立方体。对于这两个对象,我有三角形、顶点的数组,对于立方体,我有一个包含纹理数据的数组。我的问题是:我如何使用VAOs和VBOs来创建和呈现这两个? null

  • 我想知道什么等效的和帧缓冲区对象(FBO)。是否存在等价物,或者我需要自己实现一些东西?

  • 我想做一个OpenGL游戏,但现在意识到我在学校学到的- 1)我应该使用OpenGL的glDrawArray还是glDrawElements? 2) 对于具有多个实体/场地/对象的游戏,渲染函数必须是多个glDrawArrays(): 或者只有一个glDrawArrays()封装每个实体: 3)每个图形层(如DirectX)现在都标准化顶点缓冲区对象吗?

  • 问题内容: var arrObj = [{a:1, b:2},{c:3, d:4},{e:5, f:6}]; 如何将其合并为一个obj? 问题答案: 如果您的环境支持,那么您可以像这样简洁地进行操作 ES5解决方案: 您可以使用这样的 此解决方案仅将的所有键及其值收集在中的每个对象中,最终将结果返回给我们。 这张支票 有必要确保我们在结果中不包括所有继承的可枚举属性。