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

一个vbo中的多个四边形

南宫喜
2023-03-14

我正在做一个minecraft-ish游戏,我在vbos上做了更多的工作。然而在一个vbo中绘制多个面时,我似乎有点问题。

以下是我的vbo生成代码:

glGenBuffers(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, verts);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, verts * 9 * sizeof(GLfloat), NULL, GL_STATIC_DRAW);
void* ptr = glMapBuffer(GL_ARRAY_BUFFER, GL_READ_WRITE);

GLfloat*model = (GLfloat*)ptr;
GLfloat*tex = ((GLfloat*)ptr) + verts * 6;
GLfloat*color = ((GLfloat*)ptr) + verts * 3;
int p = 0;
int k = p * 3;

    for (int mcy = 0; mcy < 5; mcy++) {
        for (int mcx = 0; mcx < 5; mcx++) {
        double addonX = mcx*32.0; 
        double addonY = mcy*32.0; 
        int addonx = mcx * 32;
        int addony = mcy * 32;
        if (!(hill.get(addonX, addonY)*400.0 > 100 && hill.get(32 + addonX, addonY)*400.0 > 100 && hill.get(addonX, 32 + addonY)*400.0 > 100 && hill.get(32 + addonX, 32 + addonY)*400.0 > 100)) {
            draw = true;

            int biome1 = BiomeToColor(GetBiome(x, y, addonX, addonY), hill.get(addonX, addonY)*400.0);
            int biome2 = BiomeToColor(GetBiome(x, y, 32 + addonX, addonY), hill.get(32 + addonX, addonY)*400.0);
            int biome3 = BiomeToColor(GetBiome(x, y, addonX, 32 + addonY), hill.get(addonX, 32 + addonY)*400.0);
            int biome4 = BiomeToColor(GetBiome(x, y, 32 + addonX, 32 + addonY), hill.get(32 + addonY, 32 + addonY)*400.0);







            model[k] = addonx+ 32;
            model[k + 1] = addony;
            model[k + 2] = hill.get(addonX + 32, addonY)*400.0;

            color[k] = BiomeColors[biome2].r;
            color[k + 1] = BiomeColors[biome2].g;
            color[k + 2] = BiomeColors[biome2].b;


            p++;
            k = p * 3;



            model[k] = addonx + 32;
            model[k + 1] =  addony + 32;
            model[k + 2] = hill.get(addonX + 32, addonY + 32)*400.0;

            color[k] = BiomeColors[biome4].r;
            color[k + 1] = BiomeColors[biome4].g;
            color[k + 2] = BiomeColors[biome4].b;
            p++;
            k = p * 3;



            model[k] = addonx;
            model[k + 1] = addony + 32;
            model[k + 2] = hill.get(addonX, addonY + 32)*400.0;

            color[k] = BiomeColors[biome3].r;
            color[k + 1] = BiomeColors[biome3].g;
            color[k + 2] = BiomeColors[biome3].b;



            p++;
            k = p * 3;





            model[k] = addony;
            model[k + 1] = addony;
            model[k + 2] = hill.get(addonX, addonY)*400.0;

            color[k] = BiomeColors[biome1].r;
            color[k + 1] = BiomeColors[biome1].g;
            color[k + 2] = BiomeColors[biome1].b;


            p++; 
            k = p * 3;

        }
    }
}
glUnmapBuffer(GL_ARRAY_BUFFER);
glBindBuffer(GL_ARRAY_BUFFER, 0);

下面是我用来绘制vbo的代码:

glBindBuffer(GL_ARRAY_BUFFER, VBO);

    glVertexPointer(3, GL_FLOAT, 0, 0);
    glTexCoordPointer(3, GL_FLOAT, 0, (char*)NULL + verts * 6 * sizeof(GLfloat));
    glColorPointer(3, GL_FLOAT, 0, (char*)NULL + verts * 3 * sizeof(GLfloat));

    glDrawArrays(GL_QUADS, 0, VBO);
    glBindBuffer(GL_ARRAY_BUFFER, 0);

这是我想要的结果(在每个vbo中使用一个四边形):

不幸的是,我还是新来的,所以你必须点击这个链接:/

下面是我在每个vbo中使用多个四边形得到的结果:

形象

那么为什么我要在一个vbo中绘制多个四边形呢?一个词:性能,如果你比较两幅图像,真正弹出的东西(除了第二幅图像的bug)是帧率计数器。我想把这个游戏变成一件大事,所以每一个fps对我来说都很重要。

编辑:天哪,我真笨:

model[k] = addony;

一个非常简单的错误,但却如此邪恶。只是证明了这么小的事情是如何阻止游戏的。现在一切都正常了。

共有1个答案

鲁斯伯
2023-03-14
glDrawArrays(GL_QUADS, 0, VBO);

此呼叫存在一些问题:

  1. glDrawArrays的第三个参数是您正在绘制的内容的计数,因此您实际要说的是:

在0处从缓冲区绘制四边形,直到VBO,然后停止。

你应该说的是:

从缓冲区0处绘制四边形,直到缓冲区长度,然后停止

所以现在看起来是这样的:

glDrawArrays(GL_QUADS, 0, verts);

代码中的VBO是您要使用的Buffer的ID。把它想象成一个指针,你知道它的号码,或者更确切地说,是一个有ID的用户。

你不应该因为多种原因GL_QUADS

你为什么不使用VAO?您使用的是没有VAO的旧版本OpenGL吗?否则,我建议在这里使用VAO而不是VBO,这样就不需要为每个draw调用绑定指针。

glBindBuffer(GL_ARRAY_BUFFER, verts);

您在这里尝试的是将id为“verts”的VBO绑定到我们当前的VBO。

'那么为什么我要在一个vbo中绘制多个四边形呢?一个词:性能'

你有没有试过用实例画多个四边形?因此,为每个形状发送一个模型矩阵,以便您在着色器中修改它们的位置和形状,而不是在缓冲区中。这样,你就可以一遍又一遍地绘制一个vbo,只是用一个绘制调用稍微转换一下。

下面是一个关于实例化的好教程:

http://learnopengl.com/#!高级OpenGL/实例

只是出于好奇,但您为什么决定使用:

glMapBuffer(GL_ARRAY_BUFFER, GL_READ_WRITE);

而不是在glBufferData调用中缓冲数据?

如果以后需要缓冲数据,可以使用glBufferSubData

老实说,尽管我认为你的表现问题源于一系列因素。

我个人会使用glBufferData而不是地图数据,当我需要在运行时而不是加载时,我会使用glBufferSubData。

我会将颜色上传到着色器,并用不同的模型矩阵和颜色一次又一次地绘制相同VBO的倍数,让我可以实例化它。

然而,你不应该这样做。

我建议用三角形和颜色组成数据,把整个地面画成一个网格,你似乎试图这样做。您的问题很可能是由将glDrawArray长度设置为VBO长度引起的。

然而,在这种情况下,我将使用glBufferData构建一个VBO,其大小为一个块,然后我将使用glBufferSubData为每个具有颜色等的四边形。一旦完成,我将在不同的块旁边绘制多次。

我想这将是有用的,你做更多的OpenGL理论。

 类似资料:
  • 所以,我已经找到了实现这一点的方法。我的阵列看起来一团糟。这个问题很难解释,所以我会提供一些图片和代码。 编辑:问题是for循环和x1,y1,z1变量由浮点数控制 制作3x3x1阵列会产生以下结果:

  • 本文向大家介绍用css画一个平行四边形相关面试题,主要包含被问及用css画一个平行四边形时的应答技巧和注意事项,需要的朋友参考一下 :沿着X轴Y轴2D倾斜旋转 :沿着X轴2D倾斜旋转 :沿着Y轴2D倾斜旋转

  • 简而言之,为什么我不能将两个glBindTexture放入一个glStart(GL_QUADS)... glend()? 我将遵循OpenGL红皮书的第9章,http://www.glprogramming.com/red/chapter09.html 左边的四边形有一个白色的棋盘纹理,而右边的四边形有一个红色的纹理。 这是将纹理映射到两个四边形的代码: 我们可以看到,即使代码使用GL_四边形,它

  • (这是我第二次问这个问题了。上次我得到了一个没有解决问题的答案(那里的答案提到了我试图修复这个问题时偶然留下的一点代码)。我还稍微改变了问题本身——我改变了代码的顺序,把我认为错误更高的部分放在前面,并补充说我正在使用macOS,这可能是它不起作用的原因)。 所以,我刚刚开始学习LWJGL 3,我混合使用了一些教程和示例代码来制作一些东西,应该使用VAOs和VBOs将矩形渲染到洋红屏幕上。没有错误

  • 目前,我有一个类的集合,其中包含一个纹理、一个VAO和一个VBO。由于所有的状态切换和使用少量三角形调用,绘制数千个这样的对象会导致性能下降。 因此,现在我将更改我的实现,以便创建一系列1MIB VBO(从一个开始,一旦它满了,创建第二个1MIB VBO并继续填充它)。每个VBO需要单独的VAO吗?VBO已经使用了交错的顶点数据,所以我不是在谈论使用多个VBO来处理顶点、法线、纹理库等。

  • 我试图解决多边形与其他多边形比较的特殊情况。我有五个多边形分布如下图。面积最大的是黑色多边形。 可能还有其他类似的情况,主要规则是删除所有具有一个或多个公共边部分的多边形中最小的多边形。 此案例的数据位于GeoJson文件中,如下所示: 是否有只删除两个蓝色多边形(id 2和5)的解决方案?在python中。 通过将多边形转换为LineString,人们可以查看一个LineString是否是另一个