OpenGL光照

1.不同光源分類
1.1環境光(Ambient light):天空
1.2方向光(Directional light):太陽、月亮
1.3點光(Point light):燈泡、蠟燭
1.4聚光(Spot light):手電筒、聚光燈
2.光線反射方式
2.1漫反射(Diffuse reflection):光線反射方向平等向不同方向蔓延,地毯
2.2鏡面反射(Specular reflection):光線反射方向在某一特定方向強烈,光滑金屬、剛打過蠟的汽車
有些材質在不同環境下具備以上兩方面光線反射
3.朗伯體反射實現方向光(heightmap_vertex_shader.glsl)

//materialColor:材質顏色
//0.3:光亮度
vec3 getDirectionalLighting()
{   
    return materialColor * 0.3 
         * max(dot(eyeSpaceNormal, u_VectorToLight), 0.0);       
}

4.表面法線(suface normal)
4.1表面法線是應用於表面的而不是點,在計算每個點的法線時,把這個點的鄰接點合併在一起創建一個平面。該平面往表面的法向量即爲表面法線。
這裏寫圖片描述
4.2計算方式
首先,獲取其鄰接點;然後,用這些點創建代表其平面的兩個向量(從右到左、從上到下);最後,採用這兩個向量的叉積,並把它歸一化得到其表面法線。
5.朗伯體反射實現漫反射(heightmap_vertex_shader.glsl)

//漫反射
//scaledNormal:地面的表面法線
float diffuse = max(dot(scaledNormal, u_VectorToLight), 0.0);
diffuse *= 0.3;
v_Color *= diffuse;  

6.關聯着色器程序
7.添加方向光的光向量(ParticlesRenderer)
8.添加點光源位置、顏色(ParticlesRenderer)
9.計算攝像頭位置、向量(heightmap_vertex_shader.glsl)
10.綜合光照影響(heightmap_vertex_shader.glsl)

v_Color = getAmbientLighting();//環境光
v_Color += getDirectionalLighting();//方向光
v_Color += getPointLighting();//點光源

11.源碼:https://github.com/HQlin/Lighting/commits/master

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章