OpenGL ES 3 光照 散射光

2021-10-04 18:50:34 字數 1608 閱讀 8494

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 方面的資訊,包括攝像機的...