目錄
- 一.前言
- 二.OpenGL ES 背景關系
- 三.OpenGL ES 狀態機
- 四.快取
- 五.渲染
- 六.紋理
- 七.光柵化 Rasterization
- 八.片元著色器
- 九.頂點著色器
- 十.著?語言 GLSL
- 十一.著色器使用流程
- 十二.著色器的渲染流程
- 十三.猜你喜歡
零基礎 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 編程
一.前言
OpenGL(Open Graphics Library)是 Khronos Group (一個圖形軟硬體行業協會,該協會主要關注圖形和多媒體方面的開放標準)開發維護的一個規范,它是硬體無關的,它主要為我們定義了用來操作圖形和圖片的一系列函式的 API,OpenGL 本身并非 API,
OpenGL ES(OpenGL for Embedded Systems)是 OpenGL 的子集,針對手機、PDA 和游戲主機等嵌入式設備而設計,該規范也是由 Khronos Group 開發維護,
OpenGL ES 去除了四邊形(GL_QUADS)、多邊形(GL_POLYGONS)等復雜圖元,以及許多非絕對必要的特性,剩下最核心有用的部分,可以理解成是一個在移動平臺上能夠支持 OpenGL 最基本功能的精簡規范,
二.OpenGL ES 背景關系
OpenGL ES 是一個狀態機,相關的配置資訊會被保存在一個背景關系(Context)中,這個些值會被一直保存,直到被修改,但我們可以配置多個背景關系,通過呼叫setCurrentContext 來切換
[EAGLContext setCurrentContext:context]
三.OpenGL ES 狀態機
首先簡單了解一下什么是”狀態機”,比如我們使用的電腦,接受各種輸入(滑鼠,鍵盤,攝像頭等),然后改變自己當前的狀態,但卻并不知道狀態的改變是如何實作的,OpenGL 類似,接受各種引數,然后引數的改變引起當前狀態的改變,達到一種新的狀態(如:顏色改變,紋理變化,光照強弱變化),
OpenGL 狀態機表示一組狀態變數的集合,OpenGL 使用狀態機來保存所有的狀態變數,當一個狀態變數被修改后,它會一直保持這個狀態,直到再次修改它的狀態,
可以使用函式很簡單的對某個狀態做打開,關閉,查詢操作,以深度測驗為例:
glEnable(GL_DEPTH_TEST); 打開深度測驗
glDisable(GL_DEPTH_TEST);關閉深度測驗
glIsEnabled(GL_DEPTH_TEST);是否打開深度測驗
四.快取
OpenGL ES 部分運行在 CPU 上,部分運行在 GPU 上,為了協調這兩部分的資料交換,定義了快取(Buffers)的概念,CPU 和 GPU 都有獨自控制的記憶體區域,快取可以避免資料在這兩塊記憶體區域之間進行復制,提高效率,快取實際上就是指一塊連續的 RAM ,
五.渲染
將圖片、視頻、按鈕等繪制到螢屏上的程序叫渲染

六.紋理
紋理可以理解為圖片. 大家在渲染圖形時需要在其編碼填充圖片,為了使得 場景更加逼真.?這里使用的圖片,就是常說的紋理.但是在 OpenGL ,我們更加 習慣叫紋理,?不是圖片.
紋理是一個用來保存影像顏色的元素值的快取,渲染是指將資料生成影像的程序,紋理渲染則是將保存在記憶體中的顏色值等資料,生成影像的程序,
//獲取紋理的最大size
glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxTextureSize);
//獲取glsl支持最多的紋理數量 《= 8 超過8個紋理之后,第9個無法顯示
glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS,&maxCombinedTextureUnits);
七.光柵化 Rasterization
光柵化 Rasterization 就是把物體的數學描述以及與物體相關的顏?資訊轉換為螢屏上?于對應位置的像素及?于填充像素的顏?,
光柵化簡單一句話就是:將影像的位置和顏色資訊轉換成在螢屏上顯示的位置和顏色的資料的程序,光柵化是 OpenGL 自動完成的,開發者無法影響,
八.片元著色器
1.?般?來處理圖形中每個像素點顏色計算和填充;
2.?段著?器是 OpenGL 中?于計算?段(像素)顏色的程式,?段著色器是 逐像素運算的程式,也就是說每個像素都會執行?次?段著?器,當然也 是并行的,
通過光柵化產生的片元,需要通過片元著色器確定最終顯示在螢屏上的每個像素點的顏色值和深度值,通常來說,片元的個數是遠大于頂點的個數,所以它也是并行計算的,
頂點著色器決定一個圖元應該位于螢屏的什么位置,而片元著色器決定某個片元的顏色應該是什么
OpenGL ES 2.0 版本片元著色器
//片元著色器
precision mediump float; // 設定作業精度
varying vec2 vTextureCoord; // 接收從頂點著色器過來的紋理坐標
uniform sampler2D sTexture; // 紋理采樣器,代表一幅紋理
void main()
{
gl_FragColor = texture2D(sTexture, vTextureCoord);// 進行紋理采樣
}
OpenGL ES 3.0 版本片元著色器
//片元著色器
#version es 300
precision mediump float;
in vec3 v_color; // input form vertex shader
layout(location = 0) out vec4 o_fragColor;
void main() {
o_fragColor = vec4(v_color, 1.0);
}
關于 OpenGL ES 2.0 和 3.0 頂點著色器和片元著色器區別請參考:《OpenGL ES 2.0 和 3.0 區別》
九.頂點著色器
1.?般用來處理圖形每個頂點變換(旋轉/平移/投影等)頂點著?器是 OpenGL 中?于計算頂點屬性的程式,
2.頂點著?器是逐頂點運 算的程式,也就是說每個頂點資料都會執行一次頂點著?器,當然這是并?的,并且頂點著?器運算程序中?法訪問其他頂點的資料
3.一般來說典型的需要計算的頂點屬性主要包括頂點坐標變換、逐頂點光照 運算等等,頂點坐標由自身坐標系轉換到歸一化坐標系的運算,就是在這?發生的,
頂點著色器處理從客戶端輸入的資料,應用變換(平移,旋轉,縮放等),或者進行其他型別的數學運算來計算光照效果,位移,顏色值等,因此,頂點著色器可能很簡單也可能很復雜(比如最簡單的值傳遞),
對于繪制命令傳輸的每個頂點,OpenGL 都會呼叫頂點著色器來處理頂點相關的資料,不用擔心存在大量頂點的效率問題,它是并行計算的,頂點著色器的輸出是片元著色器的輸入,
頂點著色器決定一個圖元應該位于螢屏的什么位置,而片元著色器決定某個片元的顏色應該是什么
OpenGL ES 2.0 版本頂點著色器
//頂點著色器
attribute vec4 aPosition; // 應用程式傳入頂點著色器的頂點位置
attribute vec2 aTextureCoord; // 應用程式傳入頂點著色器的頂點紋理坐標
varying vec2 vTextureCoord; // 用于傳遞給片元著色器的頂點紋理資料
void main()
{
gl_Position = aPosition; // 此次繪制此頂點位置
vTextureCoord = aTextureCoord; // 將接收的紋理坐標傳遞給片元著色器
}
OpenGL ES 3.0 版本頂點著色器
//頂點著色器
#version es 300
uniform mat4 u_matViewProj;
layout(location = 0) in vec4 a_position;
layout(location = 1) in vec3 a_color;
out vec3 v_color;
void main() {
gl_Position = u_matViewProj * a_position;
v_color = a_color;
}
關于 OpenGL ES 2.0 和 3.0 頂點著色器和片元著色器區別請參考:《OpenGL ES 2.0 和 3.0 區別》
十.著?語言 GLSL
OpenGL 著?語言(OpenGL Shading Language)是?來在 OpenGL 中著色編程 的語言,也即開發人員寫的短小的?定義程式,他們是在圖形卡的 GPU (Graphic Processor Unit 圖形處理單元)上執行的,代替了固定的渲染管 線的一部分,使渲染管線中不同層次具有可編程性,?如:視圖轉換、投 影轉換等,
GLSL(GL Shading Language)的著?器代碼分成 2 個部分:
- Vertex Shader 頂點著?器
- Fragment 片元著器
關于 OpenGL ES 2.0 和 3.0 頂點著色器和片元著色器區別請參考:《OpenGL ES 2.0 和 3.0 區別》
十一.著色器使用流程
整個著色器的使用流程如下:
1,創建著色器物件 glCreateShader
2,把原始碼關聯到每個著色器物件 glShaderSource
3,編譯著色器 4,創建程式 glCompileShader
5,關聯著色器到程式物件 glAttachShader
6,鏈接程式 glCreateProgram
7,激活和關閉著色器程式 glUseProgram
8,洗掉著色器和程式 glDeleteProgram
具體可參考:《OpenGL ES GLSL 著色器使用程序》
十二.著色器的渲染流程

篇幅有限,更多請參考:《OpenGL ES 名詞解釋(二)》中含有關于坐標系,投影等等的講解
十三.猜你喜歡
- OpenGL ES 簡介
- OpenGL ES 版本介紹
- OpenGL ES 2.0 和 3.0 區別
- OpenGL ES 名詞解釋(一)
- OpenGL ES 名詞解釋(二)
本文由博客 - 猿說編程 猿說編程 發布!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/521803.html
標籤:其他
下一篇:C++物件模型:g++實作(二)
