0

私は物理エンジン用の API を作成しており、VBO を使用して描画しています。

私の問題は、私が得ていることですCannot use ofsets when array buffer object is disabled

完全なエラーは次のとおりです。

Exception in thread "main" org.lwjgl.opengl.OpenGLException: Cannot use offsets when Array Buffer Object is disabled
at org.lwjgl.opengl.GLChecks.ensureArrayVBOenabled(GLChecks.java:93)
at org.lwjgl.opengl.GL11.glVertexPointer(GL11.java:2657)
at com.FuZi0nHD.MyFirstGame.main.Render.draw(Render.java:38)
at com.FuZi0nHD.MyFirstGame.main.Game.<init>(Game.java:12)
at com.FuZi0nHD.MyFirstGame.client.Start.main(Start.java:14)

これが私のコードです:

クラスゲーム

public class Game {

public Game() throws LWJGLException {       
    new Init().initalize();
    Render r = new Render();
    r.dod();
    r.draw();
    Display.update();
}

}

クラス初期化

public class Init {
private static int initListSize = 8;
protected static final Init[] initList;
public static String[] initListNames;
private int id = 0;

static {
    initList = new Init[initListSize];
    for (int i = 0; i < initList.length; i++) {
        initList[i] = null;
    }
    initListNames = new String[initListSize];
    for (int i = 0; i < initListNames.length; i++) {
        initListNames[i] = "NULLOBJECTNAME";
    }

}
public void initalize() {
    addDefault();
    Initdo();
    RunList();
}

private void RunList() {
int no = initList.length;
int i = 0;
while (i < no) {
    if (initList[i] != null) {
    System.out.println("run id: " + i);
    initList[i].RunInit();
    }
    i++;
}
}

private void RunList(String name) {
}

private void addDefault() {
    addToArray(new InitDisplay(), "Display");

}

private void addToArray( Init clazz, String name) {
    initList[id] = (Init) clazz;
    initListNames[id] = name;
    id = id + 1;
}

}

クラス InitDisplay

public class InitDisplay extends Init{

@Override
public void RunInit() {
    try {
        JDisplay.setDisplay(640, 420, false);
        Display.setResizable(true);
        Display.setTitle("My Game");
        ARBBufferObject.glGenBuffersARB(Uni.ib);
        displayRender();
    } catch (LWJGLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}



private void displayRender() {
    GL11.glViewport(0, 100, Display.getX(), Display.getY());

    GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT | GL11.GL_STENCIL_BUFFER_BIT);

    GL11.glMatrixMode(GL11.GL_PROJECTION);
    GL11.glLoadIdentity();

    GL11.glMatrixMode(GL11.GL_MODELVIEW);
    GL11.glLoadIdentity();

    GL11.glEnable(GL15.GL_ARRAY_BUFFER_BINDING);

}

}

クラス JDisplay

public class JDisplay {

public static void setDisplay(int X, int Y, boolean fullscreen) throws LWJGLException {
    Display.setDisplayMode(new DisplayMode(X, Y));
    Display.setFullscreen(fullscreen);
    Display.create();
}
public static void setDefault() throws LWJGLException {
    Display.setDisplayMode(Display.getDesktopDisplayMode());
    Display.create();
}

public static void setFullscreen() throws LWJGLException {
    Display.setFullscreen(true);
    Display.create();
}
}

クラスのレンダリング

ここにエラーがあります

ライン:GL11.glVertexPointer(3, GL11.GL_FLOAT, 3, 0);

public class Render {

private FloatBuffer cBuffer = Uni.cBuffer;
private FloatBuffer vBuffer = Uni.vBuffer;
private IntBuffer ib = Uni.ib;
private int cHandle = Uni.cHandle;
private int vHandle = Uni.vHandle;


public void createNewColourBuf(int size) {
    cBuffer = BufferUtils.createFloatBuffer(size);
}

public void createNewVertexBuf(int size) {
    vBuffer = BufferUtils.createFloatBuffer(size);
}

public void draw() {
    GL11.glEnableClientState(GL11.GL_VERTEX_ARRAY);
    GL11.glEnableClientState(GL11.GL_COLOR_ARRAY);

    GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, Uni.vHandle);
    GL15.glBufferData(GL15.GL_ARRAY_BUFFER, Uni.vBuffer, GL15.GL_STATIC_DRAW);
    GL11.glVertexPointer(3, GL11.GL_FLOAT, 3, 0);

    GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, Uni.cHandle);
    GL15.glBufferData(GL15.GL_ARRAY_BUFFER, Uni.cBuffer, GL15.GL_STATIC_DRAW);
    //If a have Alfa colour change to 4
    GL11.glColorPointer(3, GL11.GL_FLOAT, 3, 0);

    GL11.glDrawArrays(GL11.GL_QUADS, 0, 4 /* elements */);

    GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);

    GL11.glDisableClientState(GL11.GL_COLOR_ARRAY);
    GL11.glDisableClientState(GL11.GL_VERTEX_ARRAY);

      // cleanup VBO handles
    ib.put(0, Uni.vHandle);
    ib.put(1, Uni.cHandle);
    ARBBufferObject.glDeleteBuffersARB(Uni.ib);
}


public void dod() {
    vBuffer.put(0.0f).put(0.0f).put(0.0f);
    vBuffer.put(1.0f).put(0.0f).put(0.0f);
    vBuffer.put(1.0f).put(1.0f).put(0.0f);
    vBuffer.put(0.0f).put(1.0f).put(0.0f);
    vBuffer.flip();

    cBuffer.put(0.5f).put(0.5f).put(0.5f);
    cBuffer.put(0.5f).put(0.5f).put(0.5f);
    cBuffer.put(0.5f).put(0.5f).put(0.5f);
    cBuffer.put(0.5f).put(0.5f).put(0.5f);
    cBuffer.flip();
}
}

クラスユニ

public interface Uni {
PropotiesFinal pf = new PropotiesFinal();

public FloatBuffer vBuffer = BufferUtils.createFloatBuffer(pf.VC_BUFFER_SIZE);
public FloatBuffer cBuffer = BufferUtils.createFloatBuffer(pf.VC_BUFFER_SIZE); 
public IntBuffer ib = BufferUtils.createIntBuffer(pf.BUFFFERS);
public int vHandle = ib.get(0);
public int cHandle = ib.get(1);

}

クラス プロパティFinal

public class PropotiesFinal {
/*
 * The size of the Vertex/Color Buffers
 */
public final int VC_BUFFER_SIZE = 1024;
public final int BUFFFERS = 2;
}

すべてのコードを提供するように求められたので、ここにあります。

4

1 に答える 1

1

私は問題を知っていると断言することはできませんが、ここに私の推奨事項があります:

まず、次のように変更してみます。

GL11.glVertexPointer(3, GL11.GL_FLOAT, 3, 0);

GL11.glVertexPointer(3, GL11.GL_FLOAT, 0, 0);

同じことがカラーポインターにも当てはまり、3をゼロに置き換えるとうまくいくかもしれません。

他に役立つもの:

  • int バッファを使用するのではなく、頂点ハンドルを作成するために GL15.glGenBuffers() を試してください。

  • あなたのコードはそれがインターフェースであることを示していますが、Uniをクラスと呼んでいます。私はそれを使用する方法に基づいたクラスであるべきだと信じています。

  • ここで見たものから、同じハードコードされた値を使用して常にバッファーを作成し、それを削除してから再度作成します。この場合、バッファを一度作成し、バッファ内の値を変更しない限り、レンダリングごとに削除しないでください。

これだけですので、お役に立てれば幸いです。

于 2013-05-27T23:36:27.823 に答える