1. 程式人生 > 實用技巧 >OpenGL 十 - 001、GLSL 簡單介紹

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和本地視窗的繪圖命令之間;

  5. 管理“渲染資源”,⽐如紋理對映(rendering map)。

3、資料

向量資料型別:

矩陣資料型別:

變數儲存限定符:

3、基礎

1).vsh / .fsh

.vsh --> 頂點著色器  .fsh --> 片元著色器

.vsh / .fsh 檔案,只是用來給開發者區分著色器程式碼。其本質是一串字串,可以用string來寫,但直接用字串形式,不便於閱讀維護。

2)資料修飾(uniform, attribute, varying)

1. uniform:1)客戶端程式碼 --> 傳遞 頂點/片元著色器裡的 變數;

     2)uniform 一般作為 頂點/片元著色器中的常量來使用,傳進來後一般是隻拿來使用,而不在著色器中進行修改

,即:不經常變化的一些資料一般用 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 分為:顏色、深度、模板 緩衝區