LWJGL - 交错式VBO没有按预期工作

时间:2014-06-16 13:44:44

标签: java lwjgl vbo

所以我一直在玩LWJGL并制作了一个3D空间,创建了许多具有随机速度和颜色的立方体,最初使用两个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);

}

}

正如我所说,我怀疑这个错误来自于:

glVertexPointer(vboHandle, GL_FLOAT, 1, 0L);
glColorPointer(vboHandle, GL_FLOAT, 1, 3L);

保留这些值会导致奇怪的闪烁效果,将glColorPointer()中的long值更改为4会奇怪地创建“&#39; region&#39;在对应于(0,0,0),(1,0,0),(0,1,0)等的颜色的立方体内,这没有任何意义,因为颜色是完全随机的浮点数,以及任何其他我试过的价值似乎除了第一个效果之外什么都不做。我在这里滥用价值观还是别的什么?任何帮助都将非常感谢,提前感谢:)

1 个答案:

答案 0 :(得分:0)

Stride&amp; offset以字节为单位指定。所以步幅应该是6个浮点数* 4个字节= 24和偏移量0(顶点)和12个(颜色)。

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

( 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)
}

More information