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