所以我一直在玩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)等的颜色的立方体内,这没有任何意义,因为颜色是完全随机的浮点数,以及任何其他我试过的价值似乎除了第一个效果之外什么都不做。我在这里滥用价值观还是别的什么?任何帮助都将非常感谢,提前感谢:)
答案 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)
}