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

一个VBO中的多个多维数据集

和和裕
2023-03-14

所以,我已经找到了实现这一点的方法。我的阵列看起来一团糟。这个问题很难解释,所以我会提供一些图片和代码。

编辑:问题是for循环和x1,y1,z1变量由浮点数控制

public void create() {
    setup();
    render();
}

private void makeCube() {
    texture = glGenBuffers();
    cube = glGenBuffers();

    FloatBuffer cubeBuffer;
    FloatBuffer textureBuffer;

    ArrayList<Float> cubeList = new ArrayList<>();
    ArrayList<Float> textureList = new ArrayList<>();

    float[] cubeFloat;
    float[] textureFloat;

    for (float x1 = 0; x1 < tileSize * width; x1 += tileSize) {
        for (float y1 = 0; y1 < tileSize * height; y1 += tileSize) {
            for (float z1 = -tileSize * depth; z1 < 0; z1 += tileSize) {
                float highX = x1 + tileSize;
                float highY = y1 + tileSize;
                float highZ = z1 + tileSize;

                float[] cubeData = new float[]{
                    /*Front Face*/
                    x1, y1, z1,
                    highX, y1, z1,
                    highX, highY, z1,
                    x1, highY, z1,
                    /*Back Face*/
                    x1, y1, highZ,
                    highX, y1, highZ,
                    highX, highY, highZ,
                    x1, highY, highZ,
                    /*Left Face*/
                    x1, y1, z1,
                    x1, y1, highZ,
                    x1, highY, highZ,
                    x1, highY, z1,
                    /*Right Face*/
                    highX, y1, z1,
                    highX, y1, highZ,
                    highX, highY, highZ,
                    highX, highY, z1,
                    /*Bottom Face*/
                    x1, y1, z1,
                    x1, y1, highZ,
                    highX, y1, highZ,
                    highX, y1, z1,
                    /*Top Face*/
                    x1, highY, z1,
                    x1, highY, highZ,
                    highX, highY, highZ,
                    highX, highY, z1};

                for (float f : cubeData) {
                    cubeList.add(f);
                }
            }
        }
    }

    cubeFloat = compileFloat(cubeList);

    for (int i = 0; i < (width * height * depth); i++) {
        float[] textureData = new float[]{
            0, 0,
            1, 0,
            1, 1,
            0, 1,
            0, 0,
            1, 0,
            1, 1,
            0, 1,
            0, 0,
            1, 0,
            1, 1,
            0, 1,
            0, 0,
            1, 0,
            1, 1,
            0, 1,
            0, 0,
            1, 0,
            1, 1,
            0, 1,
            0, 0,
            1, 0,
            1, 1,
            0, 1};

        for (Float f : textureData) {
            textureList.add(f);
        }
    }

    textureFloat = compileFloat(textureList);

    textureBuffer = asFloatBuffer(textureFloat);
    glBindBuffer(GL_ARRAY_BUFFER, texture);
    glBufferData(GL_ARRAY_BUFFER, textureBuffer, GL_DYNAMIC_DRAW);
    glBindBuffer(GL_ARRAY_BUFFER, 0);

    cubeBuffer = asFloatBuffer(cubeFloat);
    glBindBuffer(GL_ARRAY_BUFFER, cube);
    glBufferData(GL_ARRAY_BUFFER, cubeBuffer, GL_DYNAMIC_DRAW);
    glBindBuffer(GL_ARRAY_BUFFER, 0);
}

private float[] compileFloat(ArrayList<Float> list) {
    float[] f = new float[list.size()];

    for (int i = 0; i < list.size(); i++) {
        f[i] = list.get(i);
    }

    return f;
}

private void renderCube() {
    textures.get(0).bind();

    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);

    glBindBuffer(GL_ARRAY_BUFFER, cube);
    glVertexPointer(3, GL_FLOAT, 0, 0);

    glBindBuffer(GL_ARRAY_BUFFER, texture);
    glTexCoordPointer(2, GL_FLOAT, 0, 0);

    glDrawArrays(GL_QUADS, 0, 24 * (width * height * depth));

    glDisableClientState(GL_VERTEX_ARRAY);
    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
}

private void render() {
    while (!Display.isCloseRequested()) {
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glLoadIdentity();
        camera();

        renderCube();

        Display.update();
        Display.sync(30);
    }

    Display.destroy();
    System.exit(0);
}

private void setup() {
    try {
        Display.setDisplayMode(new DisplayMode(frameWidth, frameHeight));
        Display.setTitle("3D Project");
        Display.setVSyncEnabled(vSync);
        Display.create();
    } catch (LWJGLException ex) {
        Logger.getLogger(Camera.class.getName()).log(Level.SEVERE, null, ex);
    }

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(fov, (float) Display.getWidth() / (float) Display.getHeight(), zNear, zFar);
    //glOrtho(0, Display.getWidth(), Display.getHeight(), 0, -1, 1);
    glMatrixMode(GL_MODELVIEW);
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_TEXTURE_2D);

    glLoadIdentity();

    loadTextures();

    makeCube();

}

制作3x3x1阵列会产生以下结果:

共有1个答案

梁丘凯定
2023-03-14

感谢您解释tileSize使用的值。值0.1不能以任何精度用浮点表示,它会退化为基数2中的重复分数,就像大家熟悉的基数10中的1/3一样。现在,如果你继续加上这个数字,这个数字并不完全是0.1,最终的结果将与你所期望的大不相同。

通常,最好避免使用浮点表达式进行循环控制。您可能会认为,因为编译器乐于接受浮点常量(如0.1),所以一切都很好,它可以准确地表示该数字,但如果您不理解浮点数学的机制,那么类似这样的奇怪事情可能会发生。

如果您感到好奇,可以在这里找到关于我提到的问题的更详细的解释。

 类似资料:
  • 我正在做一个minecraft-ish游戏,我在vbos上做了更多的工作。然而在一个vbo中绘制多个面时,我似乎有点问题。 以下是我的vbo生成代码: 下面是我用来绘制vbo的代码: 这是我想要的结果(在每个vbo中使用一个四边形): 不幸的是,我还是新来的,所以你必须点击这个链接:/ 下面是我在每个vbo中使用多个四边形得到的结果: 形象 那么为什么我要在一个vbo中绘制多个四边形呢?一个词:性

  • 本文向大家介绍写一个方法把多维数组降维相关面试题,主要包含被问及写一个方法把多维数组降维时的应答技巧和注意事项,需要的朋友参考一下

  • 一个函数作图命令plot使不同的(x-y)变元函数生成不同的函数图象。MATLAB自动地通过预设地颜色库来区别不同的函数(也可用户自设)。例如,以下是三个x的相关函数的图象,每条曲线都由各自不同的颜色加以区分。 y2 = sin(x-.25); y3 = sin(x-.5); plot(x,y,x,y2,x,y3) legend命令提供一种简易方式来辨别不同的函数作图。 legend('sin(

  • 问题内容: 我有两个数据库和两个模型:管理员和用户。 我想将我的模型同步到两个数据库;admin模型到数据库A,用户模型到数据库B; 如果我将模型路径设置为和,则两个模型将同步到默认数据库。 如果我在命令中设置数据库,例如,则两个模型将同步到数据库B。 所以我的问题是,如何将两个模型同步到两个数据库? 问题答案: 我完全同意@alecxe使用数据库路由器。我目前正在使用一个管理界面来管理多个数据库

  • 我有两个数据库和两个模型:管理员和用户。 我想将我的模型同步到两个数据库;管理模型到数据库A,用户模型到数据库B; 如果我将模型路径设置为和,这两个模型将同步到默认数据库。 如果我在命令中设置数据库,比如,那么这两个模型将同步到数据库B。 所以我的问题是,如何将这两个模型同步到两个数据库?

  • 我有一个数组,看起来像:。而将始终保持常数。我希望x每迭代增加100。 我就是这么做的: null null 正如您所看到的,它不是在增加值。它总是只是插入。在第一个名为pies的对象中,我希望和下一个名为cakes的对象为。 我该怎么做?