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