我目前正在學習使用LWJGL的openGL。我想渲染指數的車型,但有證據顯示了一個例外......LWJGL:元素陣列緩衝區對象禁用時無法使用偏移量
我不知道,如果我知道「when元素數組緩衝區對象是殘疾人無法使用偏移」這意味着什麼,但我認爲我將索引緩衝區綁定到模型的vao。 這裏是我的代碼:
渲染
public class Renderer {
public void prepare(){
GL11.glClear(GL11.GL_COLOR_BUFFER_BIT);
GL11.glClearColor(1, 0, 0, 1);
}
public void render(RawModel model){
GL30.glBindVertexArray(model.getVaoID());
GL20.glEnableVertexAttribArray(0);
GL11.glDrawElements(GL11.GL_TRIANGLES, model.getVertexCount(), GL11.GL_UNSIGNED_INT, 0);
GL20.glDisableVertexAttribArray(0);
GL30.glBindVertexArray(0);
}
}
裝載機
public class Loader {
private List<Integer> vaoIDs = new ArrayList<Integer>();
private List<Integer> vboIDs = new ArrayList<Integer>();
public RawModel loadToVAO(float[] positions, int[] indices){
int vaoID = createVAO();
bindIndicesBuffer(indices);
storeDataInAttributeList(0, positions);
unbindVAO();
return new RawModel(vaoID, indices.length);
}
private int createVAO(){
int vaoID = GL30.glGenVertexArrays();
vaoIDs.add(vaoID);
GL30.glBindVertexArray(vaoID);
return vaoID;
}
private void storeDataInAttributeList(int attributeNumber, float[] data){
int vboID = GL15.glGenBuffers();
vboIDs.add(vboID);
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vboID);
FloatBuffer buffer = storeDataInFloatBuffer(data);
GL15.glBufferData(GL15.GL_ARRAY_BUFFER, buffer, GL15.GL_STATIC_DRAW);
GL20.glVertexAttribPointer(attributeNumber, 3, GL11.GL_FLOAT, false, 0, 0);
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
}
private FloatBuffer storeDataInFloatBuffer(float[] data){
FloatBuffer buffer = BufferUtils.createFloatBuffer(data.length);
buffer.put(data);
buffer.flip();
return buffer;
}
private void bindIndicesBuffer(int[] indices){
int vboID = GL15.glGenBuffers();
vboIDs.add(vboID);
GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, vboID);
IntBuffer buffer = storeDataInIntBuffer(indices);
GL15.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, buffer, GL15.GL_STATIC_DRAW);
}
private IntBuffer storeDataInIntBuffer(int[] data){
IntBuffer buffer = BufferUtils.createIntBuffer(data.length);
buffer.put(data);
buffer.flip();
return buffer;
}
private void unbindVAO(){
GL30.glBindVertexArray(0);
}
public void cleanUp(){
for(int vaoID : vaoIDs){
GL30.glDeleteVertexArrays(vaoID);
}
for(int vboID : vboIDs){
GL15.glDeleteBuffers(vboID);
}
}
}
型號
public class RawModel {
private int vaoID;
private int vertexCount;
public RawModel(int vaoId, int vertexCount){
this.vaoID = vaoID;
this.vertexCount = vertexCount;
}
public int getVaoID() {
return vaoID;
}
public int getVertexCount() {
return vertexCount;
}
}
主要
public class MainGameLoop {
public static void main(String[] args) {
DisplayManager.openDisplay();
Loader loader = new Loader();
Renderer renderer = new Renderer();
float[] vertices = { -0.5f, 0.5f, 0f,
-0.5f, -0.5f, 0f,
0.5f, -0.5f, 0f,
0.5f, 0.5f, 0f
};
int[] indices = { 0, 1, 3,
3, 1, 2
};
RawModel model = loader.loadToVAO(vertices, indices);
while(!Display.isCloseRequested()){
renderer.prepare();
renderer.render(model);
DisplayManager.updateDisplay();
}
loader.cleanUp();
DisplayManager.closeDisplay();
}
}
堆棧跟蹤
Exception in thread "main" org.lwjgl.opengl.OpenGLException: Cannot use offsets when Element Array Buffer Object is disabled
at org.lwjgl.opengl.GLChecks.ensureElementVBOenabled(GLChecks.java:89)
at org.lwjgl.opengl.GL11.glDrawElements(GL11.java:1117)
at renderEngine.Renderer.render(Renderer.java:20)
at tester.MainGameLoop.main(MainGameLoop.java:33)
它已有4天了,我得到這個錯誤,我不知道我做錯了。
任何幫助和答案將不勝感激,謝謝。
我會建議提供完整的stacktrace,以幫助別人固定原因。 – ajoberstar
謝謝,增加了stacktrace。似乎在嘗試渲染模型時拋出異常。但我不知道爲什麼元素緩衝區沒有綁定... – user6656221