1. 程式人生 > >opengles3.0 基礎學習(三)

opengles3.0 基礎學習(三)

opengles3.0(三)

#elif defined(__ANDROID__) || defined(ANDROID)

#include <android/native_window.h>

struct egl_native_pixmap_t;

typedef struct ANativeWindow*           EGLNativeWindowType;

typedef struct egl_native_pixmap_t*     EGLNativePixmapType;

typedef void*                           EGLNativeDisplayType;

這個是andrioid的EGLNativeWindowType

建立螢幕上的渲染區域:

           // Create a surface

   esContext->eglSurface = eglCreateWindowSurface ( esContext->eglDisplay, config,

                                                    esContext->eglNativeWindow, NULL );

建立螢幕外的渲染區域:

eglCreatePbufferSurface

Pbuffer常用於生成紋理貼圖,如果你想要做的是渲染到一個紋理,哪麼我們建議使用幀緩衝區物件代替Pbuffer.在某些幀緩衝區無法使用的情況下,Pbuffer任然可以使用。

EGLint ATTRIBlIST[] = {

   EGL_WIDTH, 512,

EGL_HEIGHT,512,

EGL_LARGEST_PBUFFER,EGL_TRUE,

EGL_NONE

eglCreatePbufferSurface(DISPLAY,CONFIG,ATTRIBlIST)

不像視窗中那樣交換緩衝區,而是從Pbuffer中將數值複製到應用程式,或者繫結pbuffer更新為紋理。

建立一個渲染上下文:

    // Create a GL context

   esContext->eglContext = eglCreateContext ( esContext->eglDisplay, config,

                                              EGL_NO_CONTEXT, contextAttribs );

   if ( esContext->eglContext == EGL_NO_CONTEXT )

   {

      return GL_FALSE;

  }

   // Make the context current

   if ( !eglMakeCurrent ( esContext->eglDisplay, esContext->eglSurface,

                          esContext->eglSurface, esContext->eglContext ) )

   {

      return GL_FALSE;

   }

 因為一個應用程式有多個EGLContext用於不同的用途,因此我們需要指定一個Context於EGLSurface繫結。

同步渲染:

你可能會碰到一些情況,即需要協調多個圖形API再單個視窗中的渲染,例如,你可能發現使用OpenVG更容易找到比Opengles 更適於在視窗中繪製字元的原生視窗系統字型渲染函式。

    eglWaitClient

   這個函式跟glFinish類似,但是不管當前操作的是哪個API 均有效。

如果你需要保證原生視窗系統的渲染完成,可以呼叫eglWaitNative