目錄
- 一. EGL 前言
- 二. EGL 繪制流程簡介
- 三.eglCreatePbufferSurface 函式簡介
- 1.eglCreatePbufferSurface 簡介
- 2.eglCreatePbufferSurface 和 eglCreateWindowSurface 區別
- 四.eglCreatePbufferSurface 使用
- 五.猜你喜歡
零基礎 OpenGL ES 學習路線推薦 : OpenGL ES 學習目錄 >> OpenGL ES 基礎
零基礎 OpenGL ES 學習路線推薦 : OpenGL ES 學習目錄 >> OpenGL ES 特效
零基礎 OpenGL ES 學習路線推薦 : OpenGL ES 學習目錄 >> OpenGL ES 轉場
零基礎 OpenGL ES 學習路線推薦 : OpenGL ES 學習目錄 >> OpenGL ES 函式
零基礎 OpenGL ES 學習路線推薦 : OpenGL ES 學習目錄 >> OpenGL ES GPUImage 使用
零基礎 OpenGL ES 學習路線推薦 : OpenGL ES 學習目錄 >> OpenGL ES GLSL 編程
一. EGL 前言
EGLNativeDisplayType – 系統顯示型別,標識你所開發設備的物理螢屏,DX/OPenGL ES/Metal/Vulkan….
EGLNativeWindowType – 系統視窗,渲染顯示的視窗句柄
EGLDisplay – 關聯 EGLNativeDisplayType 系統物理螢屏的通用資料型別,是平臺上 WGL / GLX / AGL 的等價物
EGLSurface – 渲染區域,相當于 OpenGL ES 繪圖的畫布 (一塊記憶體空間),用戶想繪制的資訊首先都要先繪制到 EGLSurface 上,然后通過 EGLDisplay 顯示
EGLConfig – 對 EGLSurface 的 EGL 配置,可以理解為繪制目標 framebuffer 的配置屬性
EGLContext – OpenGL ES 圖形背景關系
二. EGL 繪制流程簡介
- 獲取 EGL Display 物件:eglGetDisplay
- 初始化與 EGLDisplay 之間的連接:eglInitialize
- 獲取 EGLConfig 物件:eglChooseConfig / eglGetConfigs
- 創建 EGLContext 實體:eglCreateContext
- 創建 EGLSurface 實體:eglCreateWindowSurface / eglCreatePbufferSurface
- 連接 EGLContext 和 EGLSurface:eglMakeCurrent
- 使用 OpenGL ES API 繪制圖形:gl_*
- 切換 front buffer 和 back buffer 顯示:eglSwapBuffer
- 斷開并釋放與 EGLSurface 關聯的 EGLContext 物件:eglRelease
- 洗掉 EGLSurface 物件
- 洗掉 EGLContext 物件
- 終止與 EGLDisplay 之間的連接

三.eglCreatePbufferSurface 函式簡介
1.eglCreatePbufferSurface 簡介
EGLSurface eglCreatePbufferSurface(
EGLDisplay display, // 指定EGL顯示連接
EGLConfig config, // 指定配置
const EGLint *attribList) // 指定像素緩沖區屬性
/*
attribList的屬性可以是:
EGL_HEIGHT:默認值為0,
EGL_LARGEST_PBUFFER:默認值為EGL_FALSE,
EGL_MIPMAP_TEXTURE:默認值為EGL_FALSE,
EGL_TEXTURE_FORMAT:默認值為EGL_NO_TEXTURE,還可以選擇EGL_TEXTURE_RGB或>EGL_TEXTURE_RGBA,
EGL_TEXTURE_TARGET:默認值為EGL_NO_TEXTURE,還可以選擇EGL_TEXTURE_2D,
EGL_VG_ALPHA_FORMAT:只適用于OpenVG,默認值為EGL_VG_ALPHA_FORMAT_NONPRE,>還可以選擇EGL_VG_ALPHA_FORMAT_PRE,
EGL_VG_COLORSPACE:只適用于OpenVG,默認值為EGL_VG_COLORSPACE_sRGB,還可以選>擇EGL_VG_COLORSPACE_LINEAR,
EGL_WIDTH:默認值為0,
*/
相關錯誤碼:
EGL_BAD_MATCH :提供了與視窗屬性不匹配的 EGLConfig,或該 EGLConfig 不支持渲染到視窗
EGL_BAD_CONFIG :提供的 EGLConfig 沒有得到系統支持
EGL_BAD_NATIVE_WINDOW :提供的原生視窗句柄無效
EGL_BAD_ALLOC :無法為新的視窗分配資源,或已經有和提供的原生視窗關聯的 EGLConfig
2.eglCreatePbufferSurface 和eglCreateWindowSurface區別
在文章 《OpenGL ES EGL 名詞解釋》有詳細介紹, EGLSurface 一共分為三類:
1.Surface – 可顯示的 Surface,實際上就是一個 FrameBuffer,用于系結視窗后預覽顯示,通過 eglCreateWindowSurface 創建;
2.PixmapSurface – 不是可顯示的 Surface,保存在系統記憶體中的位圖;
3.PBufferSurface – 不是可顯示的 Surface,保存在顯存中的幀,用于離屏渲染,不需要系結視窗,通過 eglCreatePbufferSurface 創建
四.eglCreatePbufferSurface 使用
創建 PBufferSurface 和創建 EGL 視窗非常類似,只有少數微小的不同,為了創建 PBufferSurface,需要和視窗一樣找到 EGLConfig ,并作一處修改:我們需要擴增 EGL_SURFACE_TYPE 的值,使其包含 EGL_PBUFFER_BIT
/******************************************************************************************/
//@Author:猿說編程
//@Blog(個人博客地址): www.codersrc.com
//@File:OpenGL ES EGL eglCreatePbufferSurface
//@Time:2022/08/04 07:30
//@Motto:不積跬步無以至千里,不積小流無以成江海,程式人生的精彩需要堅持不懈地積累!
/******************************************************************************************/
EGLint attribList[] = {
EGL_SURFACE_TYPE,EGL_PBUFFER_BIT,
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES3_BIT_KHR,
EGL_RED_SIZE, 5,
EGL_GREEN_SIZE, 6,
EGL_BLUE_SIZE, 5,
EGL_DEPTH_SIZE, 1,
EGL_NONE
};
// 查詢EGL表面配置
const EGLint MaxConfigs = 10;
EGLConfig configs[MaxConfigs]; // We'll only accept 10 configs
EGLint numConfigs;
if (!eglChooseConfig(display, attribList, configs, MaxConfigs, &numConfigs)) {
// Something didn't work … handle error situation
} else {
// Everything's okay. Continue to create a rendering surface
}
// Proceed to create a 512*512 pbuffer
EGLSurface pbuffer;
EGLint attribList2[] =
{
EGL_WIDTH, 512,
EGL_HEIGHT, 512,
EGL_LARGEST_PBUFFER, EGL_TRUE,
EGL_NONE
};
pbuffer = eglCreatePbufferSurface(display, config, attribList2);
if (pbuffer == EGL_NO_SURFACE) {
switch (eglGetError()) {
case EGL_BAD_ALLOC:
// Not enough resources available. Handle and recover
break;
case EGL_BAD_CONFIG:
// Verify that provided EGLConfig is valid
break;
case EGL_BAD_PARAMETER:
// Verify that EGL_WIDTH and EGL_HEIGHT are non-negative values
break;
case EGL_BAD_MATCH:
// Check window and EGLConfig attributes to determine
// compatibility, or verify that the EGLConfig
// supports rendering to a window,
break;
}
}
EGLint width;
EGLint height;
if(!eglQuerySurface( display,pbuffer,EGL_WIDTH,&width) ||
!eglQuerySurface( display,pbuffer,EGL_HEIGHT,&height))
{
//Unable to query surface information
}
五.猜你喜歡
- OpenGL ES 簡介
- OpenGL ES 版本介紹
- OpenGL ES 2.0 和 3.0 區別
- OpenGL ES 名詞解釋(一)
- OpenGL ES 名詞解釋(二)
- OpenGL ES GLSL 著色器使用程序
- OpenGL ES EGL 簡介
- OpenGL ES EGL 名詞解釋
- OpenGL ES EGL eglGetDisplay
- OpenGL ES EGL eglInitialize
- OpenGL ES EGL eglGetConfigs
- OpenGL ES EGL eglChooseConfig
- OpenGL ES EGL eglGetError
- OpenGL ES EGL eglCreateContext
- OpenGL ES EGL eglCreateWindowSurface
- OpenGL ES EGL eglCreatePbufferSurface
本文由博客 - 猿說編程 猿說編程 發布!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/528053.html
標籤:其他
上一篇:說說switch關鍵字
下一篇:設計模式---代理模式
