-2

AndroidでopengGl Es 2を使用して3Dオブジェクトをレンダリングしています。しかし、オブジェクトがレンダリングされないという問題に直面しています。これは、画面に何も描画されないことを意味します。

public void draw(GL10 gl) 
{
    gl.glColor4f(0.0f, 1.0f, 0.0f, 0.5f);
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

    for(int i=0; i<parts.size(); i++)
    {
        TDModelPart t=parts.get(i);
        gl.glNormalPointer(GL10.GL_FLOAT, 0, t.getNormalBuffer());
        gl.glDrawElements(GL10.GL_TRIANGLES,t.getFacesCount(),GL10.GL_FLOAT,t.getFaceBuffer());
        gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
    }
}

public class TDModelPart   
    {
    Vector<Float> faces;
    Vector<Float> vtPointer;
    Vector<Float> vnPointer;
    Material material;
    private FloatBuffer normalBuffer;
    FloatBuffer faceBuffer;

    public TDModelPart(Vector<Float> faces, Vector<Float> vtPointer, Vector<Float> vnPointer, Material material, Vector<Float> vn) 
    {
        super();
        this.faces = faces;
        this.vtPointer = vtPointer;
        this.vnPointer = vnPointer;
        this.material = material;

        ByteBuffer byteBuf = ByteBuffer.allocateDirect(vnPointer.size() * 4*3);
        byteBuf.order(ByteOrder.nativeOrder());
        normalBuffer = byteBuf.asFloatBuffer();
        for(int i=0; i<vnPointer.size(); i++){
            float x=vn.get((int) (vnPointer.get(i)*3));
            float y=vn.get((int) (vnPointer.get(i)*3+1));
            float z=vn.get((int) (vnPointer.get(i)*3+2));
            normalBuffer.put(x);
            normalBuffer.put(y);
            normalBuffer.put(z);
        }
        normalBuffer.position(0);

        ByteBuffer fBuf = ByteBuffer.allocateDirect(faces.size() * 4);
        fBuf.order(ByteOrder.nativeOrder());
        faceBuffer = fBuf.asFloatBuffer();
        faceBuffer.put(toPrimitiveArrayS(faces));
        faceBuffer.position(0);
    }

    public String toString()
    {
        String str=new String();
        if(material!=null)
            str+="Material name:"+material.getName();
        else
            str+="Material not defined!";
        str+="\nNumber of faces:"+faces.size();
        str+="\nNumber of vnPointers:"+vnPointer.size();
        str+="\nNumber of vtPointers:"+vtPointer.size();
        return str;
    }

    public FloatBuffer getFaceBuffer()
    {
        return faceBuffer;
    }

    public FloatBuffer getNormalBuffer() 
    {
        return normalBuffer;
    }

    private static float[] toPrimitiveArrayS(Vector<Float> vector)      
    {
        float[] s;
        s=new float[vector.size()];
        for (int i=0; i<vector.size(); i++){
            s[i]=vector.get(i);
        }
        return s;
    }

    public int getFacesCount()
    {
        return faces.size();
    }

    public Material getMaterial()
    {
        return material;
    }
}
4

1 に答える 1

0

まず、 のデータを設定しますがglNormalPointerglEnableClientState(GL_NORMAL_ARRAY). そしてglDisableCLientState(GL_VERTEX_ARRAY)、for ループ ブロックの最後にある頂点配列 ( ) も無効にします。これは、最初の部分を描画した後、頂点配列が有効になっていないため、後続のすべての部分で何も描画されないことを意味します。

同様に、通常のデータがパーツごとに指定され、頂点データがすべてのパーツに対して 1 回だけ指定されるのは適切ではありません。おそらくこれは意図したものですが、頂点 (または位置) と法線 (および他のすべての属性) が一致する必要があるため、奇妙に見えます。つまり、これらの配列から描画する描画コマンドは、有効なすべての属性配列にアクセスするために同じインデックスを使用します。単一の頂点の場合。

于 2013-07-15T11:25:30.077 に答える