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

关于openglvbos的几个问题

阎丰
2023-03-14

我目前正在尝试用cubey地形制作一个基本游戏,类似于Minecraft classic。我的第一个问题:

如何在VBO中存储多维数据集列表,然后在更改该数据时重新生成该列表?我当前呈现的立方体如下所示:

vertices = BufferUtils.createFloatBuffer(3 * 4 * 6);
    vertices.put(new float[] {
            -1.0f, -1.0f, 1.0f,
            1.0f, -1.0f, 1.0f,
            1.0f, 1.0f, 1.0f,
            -1.0f, 1.0f, 1.0f,

            -1.0f, -1.0f, -1.0f,
            -1.0f, 1.0f, -1.0f,
            1.0f, 1.0f, -1.0f,
            1.0f, -1.0f, -1.0f,

            -1.0f, 1.0f, -1.0f,
            -1.0f, 1.0f, 1.0f,
            1.0f, 1.0f, 1.0f,
            1.0f, 1.0f, -1.0f,

            -1.0f, -1.0f, -1.0f,
            1.0f, -1.0f, -1.0f,
            1.0f, -1.0f, 1.0f,
            -1.0f, -1.0f, 1.0f,

            1.0f, -1.0f, -1.0f,
            1.0f, 1.0f, -1.0f,
            1.0f, 1.0f, 1.0f,
            1.0f, -1.0f, 1.0f,

            -1.0f, -1.0f, -1.0f,
            -1.0f, -1.0f, 1.0f,
            -1.0f, 1.0f, 1.0f,
            -1.0f, 1.0f, -1.0f});
    vertices.rewind();

    vertexBufferID = createVBOID();
    bufferData(vertexBufferID, vertices);

         public static int createVBOID() {
        if (GLContext.getCapabilities().GL_ARB_vertex_buffer_object) {
            IntBuffer buffer = BufferUtils.createIntBuffer(1);
            ARBVertexBufferObject.glGenBuffersARB(buffer);
            return buffer.get(0);
        }
        return 0;
    }

 public static void bufferData(int id, FloatBuffer buffer) {
        ARBVertexBufferObject.glBindBufferARB(ARBVertexBufferObject.GL_ARRAY_BUFFER_ARB, id);
        ARBVertexBufferObject.glBufferDataARB(ARBVertexBufferObject.GL_ARRAY_BUFFER_ARB, buffer, ARBVertexBufferObject.GL_DYNAMIC_DRAW_ARB);
    } 

public void renderGL() {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
    glViewport(0, 0, Display.getWidth(), Display.getHeight());
    glLoadIdentity();

    glRotatef(xrot, 1.0f, 0.0f, 0.0f);
    glRotatef(yrot, 0.f, 1.0f, 0.0f);
    glTranslated(-xpos, -ypos - 19, -zpos - 5);

    glEnableClientState(GL_VERTEX_ARRAY);
    ARBVertexBufferObject.glBindBufferARB(ARBVertexBufferObject.GL_ARRAY_BUFFER_ARB, vertexBufferID);
    glVertexPointer(3, GL_FLOAT, 0, 0);

    for (int y = 0; y < 16; y++) {
        for (int x = 0; x < 16; x++) {
            for (int z = 0; z < 16; z++) {
                glPushMatrix();
                glTranslatef(x, y, z);
                glDrawArrays(GL_QUADS, 0, 24);
                glPopMatrix();
            }
        }

    }
    glDisableClientState(GL_VERTEX_ARRAY);
}

我知道我需要使用glMapBufferglUnMapBuffer来修改VBO,但是如何存储多维数据集并在需要时删除它们?我应该使用ArrayList吗?另外,有人告诉我,我渲染立方体的方式是错误的,因为每个人都说我只渲染一个具有新坐标的立方体。他们说我的顶点数据保持不变,这是什么意思?

所以基本上我的问题是,1。如何使用数组保存多维数据集列表并将其加载到VBO中,然后删除一些多维数据集?2.如何更改顶点数据,以便渲染不同的立方体,而不是一次又一次地渲染一个立方体?

共有2个答案

施昊然
2023-03-14

通常情况下,场景的CPU表示(在本例中是立方体列表)和GPU表示(顶点缓冲区等)

在本例中,立方体仅由其位置定义。它们都有相同的尺寸等等。以下是一些如何渲染多个立方体的选项:

>

让GPU在其几何体着色器中创建立方体。因此,您只需在顶点缓冲区中指定立方体的位置。映射顶点缓冲区时,将获得指向可以将新数据复制到的数据的指针。

使用实例化。为着色器提供一个位置数组,并以实例模式渲染立方体。使用实例id确定偏移向量。

丁豪
2023-03-14
  • 正如antonijn所写,您可以使用1个立方体作为VBO并转换其modelview矩阵
    • 翻译有时较慢(当立方体太多时)
    • 即使在着色器内部,也可以通过比矩阵平移快一点的均匀偏移来完成平移
    • 它浪费内存,但立方体没有那么大(仅6个面)
    • 当场景更改时,将其复制到VBO进行渲染
    • 索引不是很好支持
    • 经常放慢速度,甚至撞上坏司机

    有关代码,请参见此处:https://stackoverflow.com/a/18672821/2521214但是,出于GLSL目的,post使用VAO VBO,因此如果您不使用GLSL,则需要进行一些更改。

 类似资料:
  • 如果我想为spring quartz使用cron触发器,quartz是使用java系统时间还是操作系统时间执行作业? 我计划有一个属性文件来保存我所有的cron触发器。如果有人去更改cron触发器以执行一个任务,那么quartz会自动接收文件中的更改吗?或者,如果这不是默认行为,我有没有办法告诉quartz如何执行此操作。 我最近一直在读spring批处理管理控制台。听起来像是一个很好的重新安排作

  • 下面引用的文章是一篇名为《如何编写Java卡小程序:开发人员指南》的文章的一部分,作者是陈志群。 我在这里看到了 一旦选择了一个小应用程序,JCRE就会将所有后续的APDU命令(包括SELECT命令)转发给小应用程序的进程()方法。在进程()方法中,小应用程序解释每个APDU命令,并执行命令指定的任务。对于每个命令APDU,小应用程序通过发回响应APDU来响应CAD,该响应APDU将处理命令APD

  • > 我在多个地方读到,由于U2F没有用户的概念,所以它可以用作登录的因素之一(在MFA中),但对于无密码来说并不理想,而webauthn有用户的概念,这可以帮助使用无密码。我的问题是webauthn为允许这样做而增加的额外内容是什么?是的,我们在创建凭据时传递用户信息,但最终返回的是一个凭据id(它似乎非常类似于keyhandle)并用于关联用户(在服务器上)。据我所知,webauthn def的

  • a)是否有一种方法来确保AltBeacon广告是唯一的。从某种意义上说,其他人不会错误地在他们的信标中使用相同的UUID,主要和次要ID。因为如果发生这种情况,我们的应用程序有可能识别另一家公司的信标并出现故障,反之亦然。 所以,我想知道目前在AltBeacon规范和库本身中是否有任何解决方案(变通方法)?还是他们在排队?我不确定,这是否是可以在库级别本身完成的事情,或者Android级别或者可能

  • 做作业的时候,算法的实现洪流填满了。我正在为这个指南编写一个程序:http://en.wikipedia.org/wiki/flood_fill。我有一些问题: 指定函数中的参数替换任何字符的颜色是否正常,我不知道这些坐标最初是什么颜色? 算法正确吗?例如,我在维基百科中编写了它,但我的程序的结果如下: 我的代码:

  • 本文向大家介绍总结几道关于Node.js的面试问题,包括了总结几道关于Node.js的面试问题的使用技巧和注意事项,需要的朋友参考一下 什么是error-first的回调方式 Error-first回调方式用来同时传递error和data。将错误作为第一个参数,它就必须先检查看看有没有错误先。另外的参数就用来传递data了。 你是如何避免回调地狱的? 模块化 把回调函数分割成独立的函数 使用控制流