Android OpenGL ES図面--基礎要素

8938 ワード

この文書では、OpengGLを使用して-点、線、面を描画します.

準備作業は前の記事で説明したように、Androidシステムでは頂点を定義するために浮動小数点数配列を使用することができ、浮動小数点数配列は通常Buffer(java.nio)に配置され、パフォーマンスを向上させることができます.
たとえば、次の図では、4つの頂点と対応するAndroid頂点の定義が定義されています.デフォルトでは、ビジュアル領域の4つの頂点はそれぞれv 0(-1,1,0);v1(-1,-1,0)v2(1,-1,0);v 3(1,1,0)(注:この座標は正方形ではない可能性があります)
        //          
        gl.glClear(GL10.GL_COLOR_BUFFER_BIT |
                GL10.GL_DEPTH_BUFFER_BIT);
         //     (x,y,z),       
         float vertices[] = {
                -0.5f,  0.5f, 0.0f,  // 0, Top Left
                -0.5f, -0.5f, 0.0f,  // 1, Bottom Left
                 0.5f, -0.5f, 0.0f,  // 2, Bottom Right
                 0.5f,  0.5f, 0.0f,  // 3, Top Right
        };

パフォーマンスを向上するために、これらの配列は通常javaに格納.ioで定義されたBufferクラス:
        ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length * 4);
        vbb.order(ByteOrder.nativeOrder());
        FloatBuffer vertexBuffer = vbb.asFloatBuffer();
        vertexBuffer.put(vertices);
        vertexBuffer.position(0);

頂点の定義があって、次のステップはどのようにそれらをOpenGL ESライブラリに伝達するかで、OpenGL ESはパイプPipelineになるメカニズムを提供して、このパイプはいくつかの“スイッチ”を定義してOpenGL ESがサポートするいくつかの機能を制御して、デフォルトの情況のこれらの機能は閉じて、もしOpenGL ESのこれらの機能を使う必要があるならば、OpenGL「パイピング」が必要な機能を開くことを明確に伝える必要があります.したがって、この例では、頂点座標Bufferを入力するためにOpenGLライブラリにVertex bufferを開くように伝える必要があります.次の操作に影響を及ぼさないように、機能の使用が完了したら、この機能をオフにします.
    //      
        gl.glPointSize(5f);
        //       
        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    //     
        gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
    //       
        gl.glDrawArrays(GL10.GL_POINTS, 0, vertices.length/3);
    //     
        gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
    }


OpenGLプロット線は、ルート拠点で描画する必要があります.次の例の点データは、プロット点の座標にプロット線順配列を追加します.
        short[] indices = { 0, 1, 
                            2, 0, 
                            2, 3 };

パフォーマンスを向上するために、これらの配列は通常javaに格納.ioで定義されたBufferクラス:
        ByteBuffer ibb = ByteBuffer.allocateDirect(indices.length * 2);
        ibb.order(ByteOrder.nativeOrder());
        ShortBuffer indexBuffer = ibb.asShortBuffer();
        indexBuffer.put(indices);
        indexBuffer.position(0);

描画を開始
        //       
        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    //     
        gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
        //          
        gl.glDrawElements(GL10.GL_LINES, indices.length,
                GL10.GL_UNSIGNED_SHORT, indexBuffer);
    //     
        gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);

ここでGL 10.GL_LINES:
  • GL_LINES頂点は2つ接続され、複数の線分で構成されています.
  • GL_LINE_STRIPは一連の線分を描く.
  • GL_LINE_LOOPクラスは上ですが、首と尾がつながっていて、閉じた曲線を構成しています.

  • めん
    面の頂点を定義する順序は、サーフェスを接合するときに面の頂点を定義する順序が重要です.頂点の順序は面の向き(前方または後方)を定義します.ペイントのパフォーマンスを向上させるためには、面の前面と背面はペイントされず、面の前面のみがペイントされます.[前面](Front)[背面](Back)の定義は簡単ですが、一般的には、すべての[前面](Front)の頂点の順序(時計回りまたは反時計回り)を定義します.次のコードは、反時計回りの方法をフェースの前面に設定します.
    gl.glFrontFace(GL10.GL_CCW);  

    [背面を無視](Ignore Back)の設定をオンにします.
    gl.glEnable(GL10.GL_CULL_FACE);  

    「無視」のどの面のコードが次のようになっているかを明確に示します.
    gl.glCullFace(GL10.GL_BACK);  

    描画面と描画線の差は多くありません.同じように描画時の順序を決めます.
            short[] indices = { 0, 1,
                                2, 0,
                                2, 3 };

    パフォーマンスを向上するために、これらの配列は通常javaに格納.ioで定義されたBufferクラス:
            ByteBuffer ibb = ByteBuffer.allocateDirect(indices.length * 2);
            ibb.order(ByteOrder.nativeOrder());
            ShortBuffer indexBuffer = ibb.asShortBuffer();
            indexBuffer.put(indices);
            indexBuffer.position(0);

    描画を開始
            //       
            gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
        //     
            gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
            //          
            gl.glDrawElements(GL10.GL_TRIANGLES, indices.length,
                    GL10.GL_UNSIGNED_SHORT, indexBuffer);
        //     
            gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);

    ここでGL 10.GL_TRIANGLES:
  • GL_TRIANGLESは3つの頂点ごとに1つの三角形を構成し、複数の三角形からなる.
  • GL_TRIANGLE_STRIPは隣接する3つの頂点ごとに三角形を構成し,一連の相接三角形で構成されている.
  • GL_TRIANGLE_FANは一つの点を三角形の共通頂点とし、一連の隣接する三角形を構成している.