【问题标题】:Array Buffer Object is disabled数组缓冲区对象被禁用
【发布时间】:2013-06-09 01:36:44
【问题描述】:

我尝试创建 3D 立方体,其中存储了 xpos、ypos、type 和 modelInstance。当我尝试运行程序时出现此错误:

线程“LWJGL 应用程序”org.lwjgl.opengl.OpenGLException 中的异常:禁用数组缓冲区对象时无法使用偏移量

如何启用它?

这是我收到错误的班级:

package com.me.the_unknown;

import java.util.ArrayList;

import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.VertexAttributes.Usage;
import com.badlogic.gdx.graphics.g3d.Model;
import com.badlogic.gdx.graphics.g3d.ModelBatch;
import com.badlogic.gdx.graphics.g3d.ModelInstance;
import com.badlogic.gdx.graphics.g3d.materials.Material;
import com.badlogic.gdx.graphics.g3d.materials.TextureAttribute;
import com.badlogic.gdx.graphics.g3d.utils.ModelBuilder;

public class Blocks {

    public static ArrayList<Float> blockX = new ArrayList<Float>();
    public static ArrayList<Float> blockY = new ArrayList<Float>();
    public static ArrayList<Integer> blockType = new ArrayList<Integer>();
    public static ArrayList<ModelInstance> blockModelInstance = new ArrayList<ModelInstance>();

    public static ModelBatch modelBatch;
    private static ModelBuilder modelBuilder;

    //Textures
    public static Texture stonebrick = new Texture("data/blocks/stonebrick.png");
    public static Texture gravel = new Texture("data/blocks/gravel.png");

    public static void addBlock(int xpos, int ypos, int type) {
        blockX.add((float) xpos * 5);
        blockY.add((float) ypos * 5);
        blockType.add(type);
        updateBlocks();
    }

    private static void updateBlocks() {
        blockModelInstance.clear();

        for(int counter = 0; counter < blockX.size(); counter++){
            Model model = null;
            ModelInstance instance;

            if(blockType.get(counter) == 1)
                model = modelBuilder.createBox(5f, 5f, 5f, new Material(TextureAttribute.createDiffuse(stonebrick)), Usage.Position | Usage.Normal | Usage.TextureCoordinates | Usage.Generic);
            if(blockType.get(counter) == 2)
                model = modelBuilder.createBox(5f, 5f, 5f, new Material(TextureAttribute.createDiffuse(gravel)), Usage.Position | Usage.Normal | Usage.TextureCoordinates | Usage.Generic);

            instance = new ModelInstance(model);
            blockModelInstance.add(instance);

            model.dispose();
        }
    }

    public static void create() {
        modelBuilder = new ModelBuilder();
        updateBlocks();
    }
}

【问题讨论】:

  • 没有堆栈跟踪或有关此异常触发的哪一行的命中?
  • @Grimmy 不,不在我的代码中。但是有这个:at org.lwjgl.opengl.GLChecks.ensureArrayVBOenabled(GLChecks.java:93)当我点击行号时,它说它不存在

标签: java model arraylist libgdx


【解决方案1】:

您正在创建一个模型,然后为其创建一个 ModelInstance,然后处置该模型,这实际上使该模型实例无法使用,因为它依赖于该模型。

确保模型比依赖它的模型实例的寿命更长,因为它管理它们的资源。在您的情况下,ModelInstance 将无效,因为它所依赖的 Mesh 是通过调用 model.dispose() 来处理的,从而导致您遇到错误。

同时尽量避免静态,当您的应用关闭然后重新启动时,它可能会导致设备出现问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-12
    • 1970-01-01
    • 2020-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多