0

現在、私は Android 用の 3D ゲーム エンジンに取り組んでいます。プロジェクトは始まったばかりですが、解決できない問題があります。.obj ファイルからロードされたモデルをレンダリングするために VertexBufferObjects を使用したいと考えています。ここにコードがあります

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);
    }
}

問題は、何も見えないことです。問題は、私が使用しているシェーダーではなく (正しく動作していることがわかっています)、モデルビュー マトリックスと投影マトリックスが正しいため、オブジェクトがレンダリングされていない場合はオブジェクトが表示されるはずです。誰が問題が何であるか考えていますか?

4

1 に答える 1