繁体   English   中英

错误剩余()<count <在GLSurfaceView.Renderer中需要

[英]Error remaining() < count < needed in GLSurfaceView.Renderer

我正在尝试在OpenGL ES中创建一个三角形。 但应用程式因gl.glDrawElements(GL10.GL_TRIANGLES, pIndex.length, GL10.GL_UNSIGNED_SHORT, pBuff); 在下面的代码里面draw方法。

public class GLTriangleEx {

    private float vertices[] = {
        0f, 1f, // point 0
        1f, -1f, // point 1
        -1f, -1f // point 2
    };

    private  FloatBuffer vertBuff;

    private short[] pIndex = {0, 1, 2};

    private ShortBuffer pBuff;

    public GLTriangleEx() {
        ByteBuffer bBuff = ByteBuffer.allocateDirect(vertices.length * 4);
        bBuff.order(ByteOrder.nativeOrder());
        vertBuff = bBuff.asFloatBuffer();
        vertBuff.put(vertices);
        vertBuff.position(0);

        ByteBuffer pbBuff = ByteBuffer.allocateDirect(pIndex.length * 2);
        pbBuff.order(ByteOrder.nativeOrder());
        pBuff = pbBuff.asShortBuffer();
        pBuff.put(pIndex);
        pbBuff.position(0);
    }

    public void draw(GL10 gl){
        gl.glFrontFace(GL10.GL_CW);
        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
        gl.glVertexPointer(2, GL10.GL_FLOAT, 0, vertBuff);

        // app crashes here.
        gl.glDrawElements(GL10.GL_TRIANGLES, pIndex.length, GL10.GL_UNSIGNED_SHORT, pBuff);
        gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
    }

崩溃日志猫是

            java.lang.ArrayIndexOutOfBoundsException: remaining() < count < needed
            at com.google.android.gles_jni.GLImpl.glDrawElements(Native Method)
            at com.mobility.opengleslearning.GLTriangleEx.draw(GLTriangleEx.java:45)
            at com.mobility.opengleslearning.GLRenderer.onDrawFrame(GLRenderer.java:38)
            at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1522)
            at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1239)

我检查了以下链接,以寻求帮助,但对我的情况没有用:

  1. Android OpenGL错误:“ remaining()<needed”和Android 4.4

  2. 开始学习OpenGL ES。 图四

您需要倒回用于索引的ShortBuffer 在此代码中:

ByteBuffer pbBuff = ByteBuffer.allocateDirect(pIndex.length * 2);
pbBuff.order(ByteOrder.nativeOrder());
pBuff = pbBuff.asShortBuffer();
pBuff.put(pIndex);
pbBuff.position(0);

您正在倒带pbBuff ,它是底层的ByteBuffer

asShortBuffer()返回与原始缓冲区共享基础数据的视图缓冲区。 文档 (我添加了重点):

视图缓冲区只是另一个缓冲区,其内容由字节缓冲区支持。 对字节缓冲区内容的更改将在视图缓冲区中可见,反之亦然; 两个缓冲区的位置 ,限制和标记值是独立的

因此, pBuff (它是您的视图缓冲区)具有自己的位置。 您需要倒退视图缓冲区,这是以后使用的缓冲区:

pBuff.position(0);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM