Java LWJGL-交错VBO未按预期工作

Java LWJGL-交错VBO未按预期工作,java,lwjgl,vbo,Java,Lwjgl,Vbo,所以我一直在玩LWJGL,制作了一个3D空间,创建了一些具有随机速度和颜色的立方体,最初使用了两个VBO,每个VBO用于位置和颜色 我试图使它与一个单一的,交错的VBO工作,但我的尝试到目前为止的结果是立方体绘制与'闪烁'的颜色和多个颜色每个立方体时,他们应该是单一的,纯色。看起来顶点/颜色的起始位置和步幅是错误的,但是改变它们似乎没有帮助,或者导致一些非常奇怪的效果 下面是创建VBO的类的代码。其他地方不应该有任何错误,因为它适用于非交错版本,并且它们包含等效的方法: package test

所以我一直在玩LWJGL,制作了一个3D空间,创建了一些具有随机速度和颜色的立方体,最初使用了两个VBO,每个VBO用于位置和颜色

我试图使它与一个单一的,交错的VBO工作,但我的尝试到目前为止的结果是立方体绘制与'闪烁'的颜色和多个颜色每个立方体时,他们应该是单一的,纯色。看起来顶点/颜色的起始位置和步幅是错误的,但是改变它们似乎没有帮助,或者导致一些非常奇怪的效果

下面是创建VBO的类的代码。其他地方不应该有任何错误,因为它适用于非交错版本,并且它们包含等效的方法:

package test3D.first.main;

import java.nio.FloatBuffer;
import java.util.ArrayList;

import org.lwjgl.BufferUtils;

import test3D.first.entities.*;
import test3D.first.main.threads.Updater;

import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.opengl.GL15.*;

public class InterleavedDrawer {

private int vboHandle;
private static FloatBuffer drawData;
final static int vertexSize = 3;
final static int colorSize = 3;
final static int normalSize = 3;
private static int vertexQuantity;

public InterleavedDrawer() {

    initialise();

}

private void initialise() {

    drawData = BufferUtils.createFloatBuffer(0);

    vboHandle = glGenBuffers();

    updateBuffers(Updater.objects);

}

public void draw() {

    glBindBuffer(GL_ARRAY_BUFFER, vboHandle);
    glVertexPointer(vertexSize, GL_FLOAT, 1, 0L);
    glColorPointer(colorSize, GL_FLOAT, 1, 4L);
    glBindBuffer(GL_ARRAY_BUFFER, 0);

    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_COLOR_ARRAY);
    glDrawArrays(GL_TRIANGLES, 0, vertexQuantity);
    glDisableClientState(GL_VERTEX_ARRAY);
    glDisableClientState(GL_COLOR_ARRAY);

}

public void update() {

    for (int i = 0; i < Updater.getObjectQuantity(); i++) {

        drawData.put(Updater.objects.get(i).getVertices());
        drawData.put(Updater.objects.get(i).getColors());

    }

    drawData.flip();

    glBindBuffer(GL_ARRAY_BUFFER, vboHandle);
    glBufferData(GL_ARRAY_BUFFER, drawData, GL_DYNAMIC_DRAW);
    glBindBuffer(GL_ARRAY_BUFFER, 0);

}

public void clear() {

    drawData.clear();

}

private void updateBuffers(ArrayList<AbstractEntity> objects) {

    vertexQuantity = 0;

    drawData.clear();

    for (int i = 0; i < objects.size(); i++) {

        vertexQuantity += objects.get(i).getVertexQuantity();

    }

    drawData = BufferUtils.createFloatBuffer(vertexSize * vertexQuantity + colorSize * vertexQuantity);

}

}

将值保持原样会导致奇数闪烁效果,将GLCOLORPOINT中的long值更改为4会在立方体中奇怪地创建“区域”,这些区域是对应于0、0、0、1、0、0、0、1、0等的颜色,这毫无意义,因为颜色完全是随机浮动,我尝试过的任何其他价值观似乎除了第一个效果之外没有任何作用。我是误用了这里的值还是其他什么?非常感谢您提供的任何帮助:

步幅和偏移量以字节为单位指定。因此步幅应为6个浮点*4字节=24,偏移量分别为0个顶点和12个颜色

更新中也有一个错误。现在,假设每个对象有一个三角形,顶点和颜色数据是这样交错的:

( object 1  ) ( object 2  )
V1V2V3 C1C2C3 V4V5V6 C4C5C6 ...
其中V是向量x,y,z,C是颜色r,g,b。 OpenGL希望它们按以下顺序排列:

( object 1   ) ( object 2   )
V1C1 V2C2 V3C3 V4C4 V5C5 V6C6 ...
因此,更新循环的主体应该更改为未测试的类似内容

float[] vertData = Update.object.get(i).getVertices();
float[] colorData = Update.object.get(i).getColors();

for(int j = 0; j < vertData.length; j += 3) {
   drawData.put(vertData, j, 3)
   drawData.put(colorData, j, 3)
}

我试着使用这些值,但结果只是一个黑屏-任何低于24和12的值的组合都会产生疯狂的视觉效果。。。知道为什么吗?感谢到目前为止的输入:顶点/颜色数据的交错存在问题。我已经更新了我的答案,这就解决了!非常感谢你,我只是不知道OpenGL希望缓冲区的格式如何,你帮了我很多忙:祝你度过愉快的一天!
float[] vertData = Update.object.get(i).getVertices();
float[] colorData = Update.object.get(i).getColors();

for(int j = 0; j < vertData.length; j += 3) {
   drawData.put(vertData, j, 3)
   drawData.put(colorData, j, 3)
}