OpenGL ES EGL 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 的配置屬性

EGLContextOpenGL ES 圖形上下文

二. EGL 繪製流程簡介

  1. 獲取 EGL Display 對象:eglGetDisplay
  2. 初始化與 EGLDisplay 之間的連接:eglInitialize
  3. 獲取 EGLConfig 對象:eglChooseConfig / eglGetConfigs
  4. 創建 EGLContext 實例:eglCreateContext
  5. 創建 EGLSurface 實例:eglCreateWindowSurface / eglCreatePbufferSurface
  6. 連接 EGLContext 和 EGLSurface:eglMakeCurrent
  7. 使用 OpenGL ES API 繪製圖形:gl_*
  8. 切換 front buffer 和 back buffer 顯示:eglSwapBuffer
  9. 斷開並釋放與 EGLSurface 關聯的 EGLContext 對象:eglRelease
  10. 刪除 EGLSurface 對象
  11. 刪除 EGLContext 對象
  12. 終止與 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
	}

五.猜你喜歡

  1. OpenGL ES 簡介
  2. OpenGL ES 版本介紹
  3. OpenGL ES 2.0 和 3.0 區別
  4. OpenGL ES 名詞解釋(一)
  5. OpenGL ES 名詞解釋(二)
  6. OpenGL ES GLSL 着色器使用過程
  7. OpenGL ES EGL 簡介
  8. OpenGL ES EGL 名詞解釋
  9. OpenGL ES EGL eglGetDisplay
  10. OpenGL ES EGL eglInitialize
  11. OpenGL ES EGL eglGetConfigs
  12. OpenGL ES EGL eglChooseConfig
  13. OpenGL ES EGL eglGetError
  14. OpenGL ES EGL eglCreateContext
  15. OpenGL ES EGL eglCreateWindowSurface
  16. OpenGL ES EGL eglCreatePbufferSurface

本文由博客 - 猿說編程 猿說編程 發佈!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章