AndroidでのEGLの使用手順

3493 ワード

  • EGL
  • OpenGL ESは、プラットフォームにまたがるグラフィックライブラリであり、それが動作する前に、OpenGLと同様に実際のウィンドウシステムに関連付ける必要がある.しかし、違いは、この部分の仕事には基準があり、この基準はEGLです.OpenGL時代は異なるプラットフォームでウィンドウシステムを関連付けるメカニズムがあり、Windowsではwgl、X-Windowではxgl、Apple OSではaglなどであった.以上から、OpenGLESの使用は、EGLから離れられないと理解できる.GLSurfaceViewを使用する場合、EGLと交差する必要はありません.GLSurfaceViewは内部で関連する仕事をして、OpenGLESを使用して環境を作ってくれたからです.従ってGLSurfaceViewはEGLの使用例として見ることができる.

  • EGLの使用手順
  • Display Display代表ディスプレイを取得すると、いくつかのシステムに複数のディスプレイがあり、複数のDisplayがあります.
      Display   EGLboolean eglGetDisplay(NativeDisplay dpy),      EGL_DEFAULT_DISPLAY 。                
    mEgl= (EGL10)EGLContext.getEGL();
    mEglDisplay=mEgl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY);
    
  • 初期化eglは、EGLboolean eglInitialize(EGLDisplay dpy,EGLint*major,EGLint*minor)を呼び出し、内部初期化作業を行い、EGLバージョン番号(major.minor)を返します.
    int[] version=new int[2]; //         
    mEgl.eglInitialize(mEglDisplay,version);
    
  • コンフィグがConfigとして選択されているコンフィグは、実際にはFrameBufferのパラメータを指し、一般的にEGRboolean eglChooseConfig(ELDisplay dpy,const EGRIT*attr_list,ELConfig*config,EGRIT config_size,EGRIT*num_config)が用いられ、ここでattr_リストはEGL_NONE終了のパラメータ配列は、通常id,valueの順に格納され、個別識別性の属性についてはidのみでvalueがない場合があります.//コンフィグ
    int[] configNum=new int[1];
    mEgl.eglChooseConfig(mEglDisplay,attributes,null,0,configNum);
    if(configNum[0]==0){
    	return GlError.ConfigErr;
    }
    EGLConfig[] c=new EGLConfig[configNum[0]];
    mEgl.eglChooseConfig(mEglDisplay,attributes,c,configNum[0],configNum);
    mEglConfig=c[0];
    
  • を選択
  • によってSurface Surfaceを構築することは、実際にはFrameBufferであり、ELSurface eglCreateWindowSurface(ELDisplay dpy,EGLConfig confg,NativeWindow win,EGLint*cfg_attr)によって実際に表示可能なSurfaceを作成する.システムは、通常、表示可能なSurfaceではなく、PixmapSurfaceとPBufferSurfaceの2つのSurfaceをサポートします.PixmapSurfaceはシステムメモリに保存されたビットマップであり、PBufferはディスプレイメモリに保存されたフレームです.
    switch (surfaceType){
    	case SURFACE_WINDOW:
    		return mEgl.eglCreateWindowSurface(mEglDisplay,mEglConfig,surface_native_obj,attr);
    	case SURFACE_PIM:
    		return mEgl.eglCreatePixmapSurface(mEglDisplay,mEglConfig,surface_native_obj,attr);
    	default:
    		return mEgl.eglCreatePbufferSurface(mEglDisplay,mEglConfig,attr);
    }
    
  • Contextを作成します.OpenGLのpipelineはプログラムの観点から1つの状態機であり、現在の色、テクスチャ座標、変換マトリクス、絢染モードなどの多くの状態があり、これらの状態はプログラムが提出した頂点座標などの要素に作用してフレームバッファ内の画素を形成する.OpenGLのプログラミングインタフェースでは、Contextはこのステータスマシンを表し、プログラムの主な仕事はContextにエンティティを提供し、ステータスを設定し、たまにContextからいくつかの情報を取得することです.EGLContext eglCreateContext(EGLDisplay dpy,EGLSurface write,ELSurface read,ELContext*share_list)を使用してContext
    EglContext=mEgl.eglCreateContext(mEglDisplay,mEglConfig,shareContext,contextAttr);
    
  • を作成します.
  • 切替コンテキストEGLの初期化が完了した後、現在のコンテキストをeglMakeCurrent()関数で切り替える必要があります.これによりopenglの関数が起動します.このインタフェースは、申請されたdisplay、draw(surface)、contextをバインドします.すなわちcontextの下のOpenGLAPI命令はdraw(surface)をレンダリングの最終目的地とする.一方、displayはdraw(surface)のフロントエンドとして表示される.呼び出し後、現在のスレッドで使用されているELContexはcontextです.
    boolean eglMakeCurrent(EGLDisplay display, EGLSurface draw, EGLSurface read, EGLContext context)
    
  • ペイントアプリケーションはOpenGL APIを介してペイントされ、1フレームが完了すると、eglSwapBuffers(ELDisplay dpy,ELContext ctx)が呼び出されて表示される.
  • 使い切った後に資源を解放する
    mEgl.eglMakeCurrent(mEglDisplay, EGL10.EGL_NO_SURFACE,
    EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_CONTEXT);
    mEgl.eglDestroySurface(mEglDisplay, mEglSurface);
    mEgl.eglDestroyContext(mEglDisplay, mEglContext);
    mEgl.eglTerminate(mEglDisplay);
    
  • .