我正在尝试在LWJGL中编写一些简单的测试程序。我构造了一个ByteBuffer对象,其中包含浮点值,表示点的2D网格。
当我使用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文档的阅读是,这两段代码应该产生相同的输出,但它们显然没有。我错过了什么?
答案 0 :(得分:0)
可悲的是,这个问题在问题中是看不到的。最终的实验表明,缓冲区的构造是错误的。我正在使用此代码初始化缓冲区
heightField = ByteBuffer.allocateDirect(vertex_count * 4 * 4);
然而,我切换到这一行,代码开始工作
heightField = BufferUtils.createByteBuffer(vertex_count * 4 * 4);
事实证明,ByteBuffer.allocateDirect()
并不默认为硬件字节顺序,而是默认为Java的字节顺序。这意味着当传入本机GL函数时,缓冲区中的浮点数具有相反的字节顺序。这就是为什么我在屏幕中央看到一个点。 0,0点在任何一种方式都是相同的,但所有其他字节可能都非常在渲染视口之外。