OpenGL ES 光照計算(v15)

一:頂點著色器

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)位置的每個分量做大小比較,生成布爾向量)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容