Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/197.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android VBO/IBO无法正常工作_Android_Opengl Es 2.0 - Fatal编程技术网

Android VBO/IBO无法正常工作

Android VBO/IBO无法正常工作,android,opengl-es-2.0,Android,Opengl Es 2.0,目前我正在为Android开发一个3D游戏引擎。这个项目才刚刚开始,但有一个问题我解决不了。 我想使用VertexBufferObjects渲染从.obj文件加载的模型。 这是密码 public class Mesh { private final int mBytesPerFloat = 4; private FloatBuffer vertices; private FloatBuffer normals; private IntBuffer faces;

目前我正在为Android开发一个3D游戏引擎。这个项目才刚刚开始,但有一个问题我解决不了。 我想使用VertexBufferObjects渲染从.obj文件加载的模型。 这是密码

public class Mesh {

    private final int mBytesPerFloat = 4;

    private FloatBuffer vertices;
    private FloatBuffer normals;
    private IntBuffer faces;

    private int vertexBuffer;
    private int normalBuffer;
    private int indexBuffer;

    public Mesh(float[] vertices, float[] normals, int[] faces, int shaderProgram) {

        this.normals = ByteBuffer.allocateDirect(normals.length * mBytesPerFloat)
                .order(ByteOrder.nativeOrder())
                .asFloatBuffer();
        this.normals.put(normals).position(0);

        this.faces = ByteBuffer.allocateDirect(faces.length * mBytesPerFloat)
                .order(ByteOrder.nativeOrder())
                .asIntBuffer();
        this.faces.put(faces).position(0);

        this.vertices = ByteBuffer.allocateDirect(vertices.length * mBytesPerFloat)
                .order(ByteOrder.nativeOrder())
                .asFloatBuffer();
        this.vertices.put(vertices).position(0);

        ByteBuffer bb = ByteBuffer.allocateDirect(8);
        bb.order(ByteOrder.nativeOrder());
        IntBuffer buffer = bb.asIntBuffer();        
        GLES20.glGenBuffers(1, buffer);
        vertexBuffer = buffer.get(0);       

        GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vertexBuffer);
        GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, this.vertices.capacity() * mBytesPerFloat, this.vertices, GLES20.GL_STATIC_DRAW);

        bb = ByteBuffer.allocateDirect(8);
        bb.order(ByteOrder.nativeOrder());
        buffer = bb.asIntBuffer();      
        GLES20.glGenBuffers(1, buffer);
        normalBuffer = buffer.get(0);
        GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, normalBuffer);
        GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, this.normals.capacity() * mBytesPerFloat, this.normals, GLES20.GL_STATIC_DRAW);

        bb = ByteBuffer.allocateDirect(8);
        bb.order(ByteOrder.nativeOrder());
        buffer = bb.asIntBuffer();      
        GLES20.glGenBuffers(1, buffer);
        indexBuffer = buffer.get(0);
        GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, indexBuffer);
        GLES20.glBufferData(GLES20.GL_ELEMENT_ARRAY_BUFFER, this.faces.capacity() * mBytesPerFloat, this.faces, GLES20.GL_STATIC_DRAW);
    }

    public Mesh() {
        // TODO Auto-generated constructor stub
    }

    public void render(int shaderProgram) {
        GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vertexBuffer);
        GLES20.glVertexAttribPointer(GLES20.glGetAttribLocation(shaderProgram, "vertex"), 3, GLES20.GL_FLOAT, false, 0, 0);
        GLES20.glEnableVertexAttribArray(GLES20.glGetAttribLocation(shaderProgram, "vertex"));
        GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, normalBuffer);
        GLES20.glVertexAttribPointer(GLES20.glGetAttribLocation(shaderProgram, "normal"), 3, GLES20.GL_FLOAT, false, 0, 0);
        GLES20.glEnableVertexAttribArray(GLES20.glGetAttribLocation(shaderProgram, "normal"));
        GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, indexBuffer);       
        GLES20.glDrawElements(GLES20.GL_TRIANGLES, vertices.capacity()/3, GLES20.GL_INT, faces);
    }
}
问题是我什么都没看到。 问题不在于我使用的着色器(我知道该着色器工作正常),并且modelview矩阵和投影矩阵正确,因此,如果渲染的对象不可见,则该对象应该可见。 有人知道问题可能是什么吗?

它似乎不接受
GL_INT
作为数据类型,因此可能
glpaurements
调用失败了(为了调试,可以很容易地通过一些简单的调用进行检查)。只需尝试
GL\u UNSIGNED\u INT
(如果存在的话,可以为
面使用
UIntBuffer
或类似的东西)

也许它甚至没有ES中的
GL\u UNSIGNED\u INT
,您需要2字节
GL\u UNSIGNED\u SHORT
s,但我不确定这一点。但您肯定需要一个无符号类型(有符号类型对索引有什么意义?但好吧,这就是Java)。无论如何,一些
glGetError
s可能会在这里创造奇迹