opengl es 3.0 中採用的光照模型相對現實世界進行了很大的簡化,將光照分成了 3 種組成元素(也可以稱為 3 個通道),包括環境光、散射光 以及 鏡面光。
1、散射光介紹
僅僅有環環境光的場景效果是很差的,沒有層次感。接下來將介紹另外一種真實感好很多的光照效果—散射光(diffuse),其指的是從物體表面向全方位 360°均勻反射的光,如下圖所示。
散射光具體代表的是現實世界中的物體表面被光照射時,反射光在各個方向基本均勻(也稱為「漫反射」)的情況,上圖很好地說明了這個問題。
雖然反射後的散射光在各個方向是均勻的,但散射光反射的強度與入射光的強度以及入射的角度密切相關。因此,當光源的位置發生變化時,散射光的效果會發生明顯變化。主要體現為當入射光垂直地照射到物體表面時比斜照時要亮,其具體計算公式如下。
散射光照射結果 = 材質的反射係數 * 散射光強度 * max(cos(入射角), 0) 。
2、在前述「繪製球體」的基礎上,進行環境光的渲染
頂點著色器,引入了散射光diffuse:
#version 300 es
uniform mat4 umvpmatrix; //總變換矩陣
uniform mat4 ummatrix; //變換矩陣(包括平移、旋轉、縮放)
uniform vec3 ulightlocation;
in vec3 aposition; //頂點位置
in vec3 anormal; //頂點法向量
out vec3 vposition; //用於傳遞給片元著色器的頂點位置
out vec4 vdiffuse; //用於傳遞給片元著色器的散射光分量
void pointlight ( //散射光光照計算的方法
in vec3 normal, //法向量
inout vec4 diffuse, //散射光計算結果
in vec3 lightlocation, //光源位置
in vec4 lightdiffuse //散射光強度
)void main()
#version 300 es
precision mediump float;
uniform float ur;
in vec3 vposition;//接收從頂點著色器過來的頂點位置
in vec4 vdiffuse;//接收從頂點著色器過來的散射光最終強度
out vec4 fragcolor;
void main()
else
//最終顏色
vec4 finalcolor=vec4(color,0);
//根據散射光最終強度計算片元的最終顏色值
fragcolor=finalcolor*vdiffuse;
}
3、渲染結果示例
可見,引入散射光之後,光照的效果明顯了很多,層次感也更明顯。
OpenGL ES 3 紋理基礎
1 讀取檔案 將儲存的檔案讀取到記憶體 方法很多 inputstream is this.getresources openrawresource path bitmap bitmaptmp try finally catch ioexception e 2 載入紋理 將記憶體影象資料上傳到視訊記憶...
OpenGL ES 3 紋理環繞
紋理座標的範圍通常是從 0,0 到 1,1 那如果我們把紋理座標設定在範圍之外會發生什麼?無論是 s 軸還是 t 軸的紋理座標都是在 0.0 1.0 的範圍內,這滿足了大多數情況。但在特定的情況下,也可以設定大於 1 的紋理座標。當紋理座標大於 1 以後,設定的?方式就會起作用了。1 重複紋理環繞 ...
OpenGL ES 3 投影方式 詳述
1 攝像機的設定 從日常生活的經驗中可以很容易地了解到,隨著攝像機位置 姿態的不同,就算是對同一 個場景進行拍攝,得到的畫面也是迥然不同的。因此攝像機的位置 姿態在opengl es 應用程式的開發中就顯得非常重要,首先需要介紹一下攝像機的設定方法。攝像機的設定需要給出 3 方面的資訊,包括攝像機的...