一:頂點著色器
precision highp float;
varying lowp vec2 vTextCoor;
varying lowp vec4 varyColor;
uniform sampler2D colorMap;
void main()
{
vec4 weakMask = texture2D(colorMap, vTextCoor);
vec4 mask = varyColor;
float alpha = 0.3;
vec4 tempColor = mask * (1.0 - alpha) + weakMask * alpha;
gl_FragColor = tempColor;
}
// gl_Position
// gl_PointSize
2:頂點著色器任務(wù)
1:矩陣變換位置
2:計算光照公式生成逐頂點顏色
3:生成/變換紋理坐標(biāo)
總結(jié):它可以用于執(zhí)行自定義計算,實施新的變換,照明或者傳統(tǒng)的固定功能所不允許的基于頂點的效果。
3:頂點著色器內(nèi)建特殊變量
gl_VertexID
gl_InstanceID
gl_Position
gl_PointSize
gl_FrontFacing
4:內(nèi)建Uniform--統(tǒng)一變量
參考:https://blog.csdn.net/linuxheik/article/details/79582106
shader中與外部連接的常量,初始化之后不能夠修改其值。否則會引起編譯錯誤。
在shader中定義
uniform mat4 projectionMatrix;
uniform mat4 modelViewMatrix;
在外部調(diào)用
//11.找到myProgram中的projectionMatrix、modelViewMatrix 2個矩陣的地址。如果找到則返回地址,否則返回-1,表示沒有找到2個對象。
GLuint projectionMatrixSlot = glGetUniformLocation(self.myProgram, "projectionMatrix");
GLuint modelViewMatrixSlot = glGetUniformLocation(self.myProgram, "modelViewMatrix");
5:頂點著色器內(nèi)建常量
const mediump int gl_MaxVertexAttribs = 16; //頂點著色器中屬性的最大數(shù)量
const mediump int gl_MaxVertexUniformVectors = 256; //頂點著色器中統(tǒng)一變量的最大數(shù)量
const mediump int gl_MaxVertexOutputVectors = 16; //頂點著色器中輸出向量的最大數(shù)量
const mediump int gl_MaxVertexTextureImageUnits = 16; //頂點著色器中紋理單元的最大數(shù)量
const mediump int gl_MaxCombinedTextureImageUnits = 32;//頂點著色器和片元著色器中紋理單元最大數(shù)量的總和
6:內(nèi)建特殊變量
| 變量 | 描述 |
|---|---|
| gl_VertexID | 輸入變量,用于保存頂點的整數(shù)索引。highp 精度的整數(shù)變量 |
| gl_InstanceID | 輸入變量,用于保存實例化繪圖調(diào)用中圖元的實例編號。highp 精度的整數(shù)變量,通常情況下為 0 |
| gl_Position | 輸出變量,用于輸出頂點作為的裁剪坐標(biāo)。highp 精度的浮點變量 |
| gl_PointSize | 用于指定點精靈的尺寸,單位為像素。highp 精度的浮點變量 |
| gl_FrontFacing | 不由頂點著色器直接寫入,而是根據(jù)頂點著色器生成的位置值和渲染的圖元類型生成,它是一個布爾變量 |
6:頂點著色器矩陣變換
MVP(矩陣變換)
模型--->視圖--->投影
二:片元著色器
precision highp float;
varying lowp vec2 vTextCoor;
varying lowp vec4 varyColor;
uniform sampler2D colorMap;
void main()
{
vec4 weakMask = texture2D(colorMap, vTextCoor);
vec4 mask = varyColor;
float alpha = 0.3;
vec4 tempColor = mask * (1.0 - alpha) + weakMask * alpha;
gl_FragColor = tempColor;
}
//gl_FragColor
2:片元著色器業(yè)務(wù)
1:計算顏色
2:獲取紋理
3:往像素點中填充顏色值【紋理值/顏色值】
總結(jié):它可以用于圖片。視頻。圖形中每個像素的顏色填充【比如給視頻添加濾鏡,實際上就是將視頻中每個圖片的像素點顏色填充進行修改】
3:內(nèi)建常量
const mediump int gl_MaxFragmentInputVectors = 15; //片元著色器出入的最大數(shù)量
const mediump int gl_MaxTextureImageUnits = 16;//可用紋理圖像單元的最大數(shù)量
const mediump int gl_MaxFragmentUniformVectors = 224;//片元著色器可用vec4 uniform變量的最大數(shù)量
const mediump int gl_MaxDrawBuffers = 4; //多重渲染目標(biāo)最大支持數(shù)量
4:內(nèi)建特殊變量
| 變量 | 描述 |
|---|---|
| gl_FragCoord | 只讀變量,這個變量保存片元的窗口相對坐標(biāo) |
| gl_ForntFacing | 只讀變量,這個布爾變量是正面圖元時為true否則為false |
| gl_PointCoord | 只讀變量,可以在渲染點精靈的時候使用,保存了點精靈的紋理坐標(biāo),這個坐標(biāo)在點精靈光柵化期間自動生成,處于(0,1)區(qū)間。 |
| gl_FragDepth | 一個只寫輸出變量,在片元著色器寫入時,覆蓋片元的固定功能深度值,盡量減少手動實現(xiàn)深度值寫入,這個功能需要謹慎使用,因為它可能禁用許多GPU的深度優(yōu)化,例如:許多GPU都有“Early-z”的功能,在執(zhí)行片元著色器之前進行深度測試,使用“Early-z”的好處就是不能通過深度測試的片元就不會被著色(從而降低了著色器的調(diào)用次數(shù),提高了性能)但是使用gl_FragDepth,就必須禁用該功能,因為GPU在執(zhí)行著色器之前不知道深度值。 |
5:內(nèi)建函數(shù)
常用內(nèi)建函數(shù)
| 函數(shù) | 說明 |
|---|---|
| dot | 點乘 |
| cross | 叉乘 |
| texture2D | 用于對紋理采樣 |
| normalize | 對于一個向量規(guī)格化 |
| clamp | 將一個向量固定在一個最小值和最大值之間 |
| pow | 冪函數(shù)(對矢量和標(biāo)量同樣有效,下同) |
| exp,log | 指數(shù)函數(shù),對數(shù)函數(shù) |
| abs | 絕對值 |
| sqrt | 平方根 |
| max,min | 最值 |
| ceil,floor | 去大于實參的最小整數(shù),取小于實參的最大整數(shù) |
| sin,cos,tan | 正三角函數(shù) |
| asin,acos,atan | 反三角函數(shù) |
| length | 向量長度 |
| distance | 兩個向量的距離 |
| matrixCompMult | 矩陣對應(yīng)元素分別相乘 |
| transpose,determinant,inverse | 矩陣的轉(zhuǎn)置,行列式,逆 |
| lessThan,greaterThan,equal | 小于,大于,等于(對實參向量對應(yīng)位置的每個分量做大小比較,生成布爾向量) |