-1

我正在尝试在 LWJGL 中编写一些简单的测试程序。我已经构建了一个 ByteBuffer 对象,其中充满了代表二维点网格的浮点值。

当我使用 glBegin/glEnd 渲染网格时,我看到了正确的输出:

    float[] values = new float[MESH_SIZE * MESH_SIZE * 4];
    heightField.position(0);
    heightField.asFloatBuffer().get(values);
    glBegin(GL_POINTS);
    for (int i = 0; i < MESH_SIZE * MESH_SIZE; ++i) {
        int offset = i * 4;
        glVertex3f(values[offset], values[offset + 1], values[offset + 2]);
    }
    glEnd();

当我使用 glVertexPointer 渲染它时,除了屏幕中心的单个点之外,它无法生成任何东西。

    heightField.position(0);
    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(3, GL_FLOAT, 4 * 4, heightField);
    glDrawArrays(GL_POINTS, 0, MESH_SIZE * MESH_SIZE);
    glDisableClientState(GL_VERTEX_ARRAY);

我对 OpenGL 和 lwjgl 文档的阅读是,这两段代码应该产生相同的输出,但它们显然不会。我错过了什么?

4

1 回答 1

0

可悲的是,问题在问题中不可见。最终实验表明缓冲区的构造有问题。我正在使用此代码来初始化缓冲区

    heightField = ByteBuffer.allocateDirect(vertex_count * 4 * 4);

但是,我切换到这一行,代码开始工作

    heightField = BufferUtils.createByteBuffer(vertex_count * 4 * 4);

事实证明,ByteBuffer.allocateDirect()它并不默认为硬件字节顺序,而是默认为 Java 的字节顺序。这意味着当传入本机 GL 函数时,缓冲区中的浮点数具有反转的字节顺序。这就是为什么我在屏幕中央看到一个点。无论哪种方式,0,0 点都是相同的,但所有其他字节可能都在渲染视口之外。

于 2013-05-16T05:18:42.167 回答