OpenGL 十 - 001、GLSL 簡單介紹
一、基礎
1、OpenGL ES 不同版本
OpenGL ES 1.X:針對固定功能流水管線硬體
OpenGL ES 2.X:針對可程式設計流水管線硬體
OpenGL ES 3.X:OpenGL ES 2.0 的擴充套件
2、EGL的主要功能:
1. 和本地窗⼝系統(native windowing system)通訊;
2. 查詢可⽤的配置;
3. 建立 OpenGL ES 可⽤的“繪圖表面”(drawing surface);
4. 同步不同類別的 API 之間的渲染,如在 OpenGL ES 和 OpenVG 之間同步,或者在 OpenGL和本地視窗的繪圖命令之間;
3、資料
向量資料型別:
矩陣資料型別:
變數儲存限定符:
3、基礎
1).vsh / .fsh
.vsh --> 頂點著色器 .fsh --> 片元著色器
.vsh / .fsh 檔案,只是用來給開發者區分著色器程式碼。其本質是一串字串,可以用string來寫,但直接用字串形式,不便於閱讀維護。
2)資料修飾(uniform, attribute, varying)
1. uniform:1)客戶端程式碼 --> 傳遞 頂點/片元著色器裡的 變數;
2)uniform 一般作為 頂點/片元著色器中的常量來使用,傳進來後一般是隻拿來使用,而不在著色器中進行修改
傳什麼(用來修飾什麼):一般傳 檢視矩陣、投影矩陣、投影檢視矩陣。
傳遞方法:gluniformXXX
舉例:著色器中程式碼:uniform mat4 viewProMatrix;// 4行4列的矩陣 變數viewProMatrix,傳遞方式使用 uniform 傳遞
客戶端往裡面傳值:gluniformXXX 方法。
2. attribute:1)客戶端程式碼 --> 只能傳到 頂端著色器中 --> 只能在頂點著色器中使用
一般修飾:頂點、紋理座標、顏色等 --> 一切和座標、顏色相關的
傳遞方法:glvertexXXX --> 注意:傳值一定要開啟開關,因為預設 attribute 是關閉的。
舉例: 著色器中程式碼:attribute vec4 position;attribute vec4 color;attribute vec2 texture; // 4維向量 position,修飾符 attribute 表示 它使用attribute 方式傳遞。
3. varying:當資料需要通過 頂點著色器間接的傳遞到片元著色器時 會用 varying 修飾
紋理座標 通過頂點著色器間接傳到片元著色器:varying lowp vec2 ;//lowp 表示低精度-> 紋理座標本就是0~1所以使用低精度即可
注意:客戶端傳值,需要在著色器中的宣告和客戶端程式碼中的宣告 一致--> 若著色器中沒有相關宣告,表示沒有傳給著色器相應資料。
二、執行過程與 API
1、過程
需要建立 2 個基本物件才能⽤著⾊器進行渲染:著⾊器物件和程式物件。
獲取 連結後著⾊器物件 的過程 一般包括以下 6 步:
1、建立⼀個頂點著⾊器物件和⼀個⽚段著⾊器物件
2、將原始碼連結到每個著⾊器物件
3、編譯著⾊器物件
4、建立⼀個程式物件
5、將編譯後的著⾊器物件連線到程式物件
6、連結程式物件
2、主要 API
/* type: 建立著⾊器的型別,GL_VERTEX_SHADER 或者 GL_FRAGMENT_SHADER 返回值: 指向新著⾊器物件的控制代碼.可以調⽤ glDeleteShader 刪除 */ GLuint glCreateShader(GLenum type); // shader: 要刪除的著⾊器物件控制代碼 void glDeleteShader(GLuint shader); /* shader — 指向著⾊色器器物件的句控制代碼 count: 著⾊器源字串的數量,著⾊器可以由多個源字串組成,但是每個著⾊器只有⼀個 main 函式 string: 指向儲存數量 count 的著⾊器源字串的陣列指標 length: 指向儲存每個著⾊器字串⼤小且元素數量為 count 的整陣列指標 */ void glShaderSource(GLuint shader , GLSizei count ,const GLChar * const *string, const GLint *length); // shader:需要編譯的著⾊器物件控制代碼 void glCompileShader(GLuint shader); /* shader:需要編譯的著⾊器物件控制代碼 pname:獲取的資訊引數,可以為: GL_COMPILE_STATUS / GL_DELETE_STATUS / GL_INFO_LOG_LENGTH / GL_SHADER_SOURCE_LENGTH / GL_SHADER_TYPE params:指向查詢結果的整數儲存位置的指標 */ void glGetShaderiv(GLuint shader , GLenum pname , GLint *params ); /* shader:需要獲取資訊⽇志的著⾊器物件控制代碼 maxLength:儲存資訊⽇志的快取區⼤小 length:寫⼊的資訊日誌的長度(減去 null 終止符), 如果不需要知道長度,這個引數可以為 Null infoLog:指向儲存資訊⽇志的字元快取區的指標 */ void glGetShaderInfolog(GLuint shader , GLSizei maxLength, GLSizei *length , GLChar *infoLog); /* 建立一個程式物件 返回值: 返回⼀個執⾏行新程式物件的控制代碼 */ GLUint glCreateProgram( ); // program:指向需要刪除的程式物件控制代碼 void glDeleteProgram( GLuint program ) /* 著⾊器與程式連線/附著 program : 指向程式物件的控制代碼 shader : 指向程式連線的著⾊器物件的控制代碼 */ void glAttachShader( GLuint program , GLuint shader ); // 斷開連線 void glDetachShader(GLuint program); // link glLinkProgram(GLuint program); /* 連結程式之後, 需要檢查連結是否成功. 可以使用 glGetProgramiv 檢查連結狀態. program: 需要獲取資訊的程式物件控制代碼 pname : 獲取資訊的引數,可以是: GL_ACTIVE_ATTRIBUTES GL_ACTIVE_ATTRIBUTES_MAX_LENGTH GL_ACTIVE_UNIFORM_BLOCK GL_ACTIVE_UNIFORM_BLOCK_MAX_LENGTH GL_ACTIVE_UNIFROMS GL_ACTIVE_UNIFORM_MAX_LENGTH GL_ATTACHED_SHADERS GL_DELETE_STATUS GL_INFO_LOG_LENGTHGL_LINK_STATUS GL_POGRAM_BINARY_RETRIEVABLE_HINT GL_TRANSFORM_FEEDBACK_BUFFER_MODE GL_TRANSFORM_FEEDBACK_VARYINGS GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH GL_VALIDATE_STATUS params : 指向查詢結果整數儲存位置的指標 */ void glGetProgramiv (GLuint program,GLenum pname, GLint *params); /* 從程式資訊⽇志中獲取資訊 program : 指向需要獲取資訊的程式物件控制代碼 maxLength : 儲存資訊⽇志的快取區⼤小 length : 寫⼊的資訊日誌⻓度(減去 null 終⽌符),如果不需要知道⻓度,這個引數可以為 Null. infoLog : 指向儲存資訊日誌的字元快取區的指標 */ void glGetPorgramInfoLog( GLuint program ,GLSizei maxLength, GLSizei *length , GLChar *infoLog ) // program: 設定為活動程式的程式物件 void glUseProgram(GLuint program)
三、RenderBuffer 和 FrameBuffer
RenderBuffer 渲染緩衝區物件是由應用程式分配的2D影象緩衝區。渲染緩衝區可用於分配和儲存 顏色、深度或模板值,並可用作幀緩衝區物件中的顏色、深度或模板附件。渲染緩衝區類似於提供可繪製表面的離屏視窗系統,例如 pbuffer。但是,渲染緩衝區不能直接用作 GL 紋理。
-->RenderBuffer 為顏色、深度、模板緩衝值提供了附著點,而 RenderBuffer 又被附加到 FrameBuffer。
FrameBufferObject(FBO) 更類似與一個管理者。
RenderBuffer 分為:顏色、深度、模板 緩衝區