最近在做用OpenGL顯示YUV數(shù)據(jù)的工作。完成之后,,決定將學(xué)到的東西整理總結(jié)一下,。 在探索OpenGL的過程中,一篇英文的tutorial讓我受益匪淺,。 我自己的總結(jié)也將主要取材于此,。那篇tutorial的作者是個巴西人,其英文雖然語法不甚精湛,,但文章可讀性極好,。 如果你英文還可以,強(qiáng)烈推薦讀原文,,比我這總結(jié)有用多了,。 本文主要介紹OpenGL的基本概念。 OpenGL的組成OpenGL主要包括三個要素:
原件原件包括點(diǎn),、線,、三角形。有的OpeGL版本還包括四邊形,,但在OpenGL ES(見文末說明)中只有這三種原件,。 緩沖區(qū)包括三個概念:
幀緩沖區(qū)是GL儲存渲染結(jié)果的地方。它可以包含多個圖像,,也就是包含多個渲染緩沖區(qū),。 渲染緩沖區(qū)就是一個圖像,例如顏色圖像,、深度圖像、模版圖像(決定每個位置是否可見的掩膜)等,。 緩沖區(qū)對象就是程序員提供給OpenGL的數(shù)據(jù),,分為結(jié)構(gòu)類和索引類的。 前者被稱為“數(shù)組緩沖區(qū)對象”或“頂點(diǎn)緩沖區(qū)對象”(“Array Buffer Object”或“Vertex Buffer Object”),,即用來描述模型的數(shù)組,,如頂點(diǎn)數(shù)組、紋理數(shù)組等,; 后者被稱為“索引緩沖區(qū)對象”(“Index Buffer Object”),,是對上述數(shù)組的索引。 光柵化光柵化的過程就是根據(jù)緩沖區(qū)對象里提供的數(shù)據(jù)經(jīng)過渲染從3D模型得到2D圖像的過程,。 得到的2D圖像會根據(jù)幀緩沖區(qū)的配置來決定是直接送到屏幕顯示或是做別的用處,。 OpenGL的流水線從2.0版本開始,OpenGL支持可編程的流水線,。也就是說,,程序員可以通過Shader(一種程序)來控制GPU渲染的過程,。 Shader分為Vertex Shader和Fragment Shader。這兩種Shader是成對出現(xiàn)的,,GPU先執(zhí)行前者,,后執(zhí)行后者。 Vertex ShaderVertex Shader對于3D模型網(wǎng)格的每個頂點(diǎn)執(zhí)行一次,,主要是確定該頂點(diǎn)的最終位置,。 Vertex Shader還會準(zhǔn)備并輸出一些變量,傳給Fragment Shader使用,。 Fragment ShaderFragment Shader對于最終得到的2D圖像的每個像素處理一次,。3D物體的表面最終顯示成什么樣將由它決定。 例如為模型的可見表面添加紋理,,處理光照,、陰影的影響等等,都在這里做,。Fragment Shader的輸出是一個RGBA格式的像素顏色值,。 OpenGL,OpenGL ES,,EGL和EAGLOpenGL提供一組API,,各顯卡制造商和系統(tǒng)制造商來實(shí)現(xiàn)這組API。OpenGL ES (Embedded System)是OpenGL的嵌入式系統(tǒng)版本,,用于手機(jī)等移動設(shè)備,。 可以簡單認(rèn)為OpenGL ES是OpenGL的一個子集。 EGL是另外一組API,,主要由系統(tǒng)制造商實(shí)現(xiàn),。它負(fù)責(zé)OpenGL和原生窗口系統(tǒng)之間的接口,用于把OpenGL渲染的結(jié)果顯示在屏幕上,。 EAGL是Apple公司對EGL做了修改,,自己實(shí)現(xiàn)的一套屏幕顯示接口,一般只用于iOS和OS X系統(tǒng)中,。 OpenGL圖示最后,,給出一幅包含上面這些概念的圖。 最近在做用OpenGL顯示YUV數(shù)據(jù)的工作,。完成之后,,決定將學(xué)到的東西整理總結(jié)一下。 在探索OpenGL的過程中,,一篇英文的tutorial讓我受益匪淺,。 我自己的總結(jié)也將主要取材于此。那篇tutorial的作者是個巴西人,其英文雖然語法不甚精湛,,但文章可讀性極好,。 如果你英文還可以,強(qiáng)烈推薦讀原文,,比我這總結(jié)有用多了,。 本文主要介紹OpenGL的基本概念。 OpenGL的組成OpenGL主要包括三個要素:
原件原件包括點(diǎn),、線,、三角形。有的OpeGL版本還包括四邊形,,但在OpenGL ES(見文末說明)中只有這三種原件,。 緩沖區(qū)包括三個概念:
幀緩沖區(qū)是GL儲存渲染結(jié)果的地方。它可以包含多個圖像,,也就是包含多個渲染緩沖區(qū),。 渲染緩沖區(qū)就是一個圖像,例如顏色圖像,、深度圖像,、模版圖像(決定每個位置是否可見的掩膜)等。 緩沖區(qū)對象就是程序員提供給OpenGL的數(shù)據(jù),,分為結(jié)構(gòu)類和索引類的,。 前者被稱為“數(shù)組緩沖區(qū)對象”或“頂點(diǎn)緩沖區(qū)對象”(“Array Buffer Object”或“Vertex Buffer Object”),即用來描述模型的數(shù)組,,如頂點(diǎn)數(shù)組,、紋理數(shù)組等; 后者被稱為“索引緩沖區(qū)對象”(“Index Buffer Object”),,是對上述數(shù)組的索引,。 光柵化光柵化的過程就是根據(jù)緩沖區(qū)對象里提供的數(shù)據(jù)經(jīng)過渲染從3D模型得到2D圖像的過程。 得到的2D圖像會根據(jù)幀緩沖區(qū)的配置來決定是直接送到屏幕顯示或是做別的用處,。 OpenGL的流水線從2.0版本開始,,OpenGL支持可編程的流水線。也就是說,,程序員可以通過Shader(一種程序)來控制GPU渲染的過程。 Shader分為Vertex Shader和Fragment Shader,。這兩種Shader是成對出現(xiàn)的,,GPU先執(zhí)行前者,后執(zhí)行后者,。 Vertex ShaderVertex Shader對于3D模型網(wǎng)格的每個頂點(diǎn)執(zhí)行一次,,主要是確定該頂點(diǎn)的最終位置。 Vertex Shader還會準(zhǔn)備并輸出一些變量,,傳給Fragment Shader使用,。 Fragment ShaderFragment Shader對于最終得到的2D圖像的每個像素處理一次,。3D物體的表面最終顯示成什么樣將由它決定。 例如為模型的可見表面添加紋理,,處理光照,、陰影的影響等等,都在這里做,。Fragment Shader的輸出是一個RGBA格式的像素顏色值,。 OpenGL,OpenGL ES,,EGL和EAGLOpenGL提供一組API,,各顯卡制造商和系統(tǒng)制造商來實(shí)現(xiàn)這組API。OpenGL ES (Embedded System)是OpenGL的嵌入式系統(tǒng)版本,,用于手機(jī)等移動設(shè)備,。 可以簡單認(rèn)為OpenGL ES是OpenGL的一個子集。 EGL是另外一組API,,主要由系統(tǒng)制造商實(shí)現(xiàn),。它負(fù)責(zé)OpenGL和原生窗口系統(tǒng)之間的接口,用于把OpenGL渲染的結(jié)果顯示在屏幕上,。 EAGL是Apple公司對EGL做了修改,,自己實(shí)現(xiàn)的一套屏幕顯示接口,一般只用于iOS和OS X系統(tǒng)中,。 OpenGL圖示最后,,給出一幅包含上面這些概念的圖。
|
|