OpenGL ES 光照模型(一)

關(guān)于光照模型的總結(jié)嚷兔,我就不一一細(xì)談了,一是自己記不住那么多做入,二呢冒晰,我覺得知識(shí)還是要實(shí)踐為主。所以以下的東西主要針對(duì)編程而言的竟块,不會(huì)涉及很綜合深刻的講解壶运。照例最后可以猛戳下載代碼。
1.漫反射
漫反射光大概就是從光源照射到物體表面浪秘,不考慮人的觀察視角與反射的角度形成的光源強(qiáng)弱差別蒋情,而只考慮光源入射角和頂點(diǎn)法線的夾角埠况,在各個(gè)方向上均等的反射光線的一種光。
假設(shè)Ld表示光源強(qiáng)度棵癣,Kd表示某個(gè)物體的反射系數(shù)辕翰,那么漫反射公式就是
Ia = Ld * Kd * cos(b)
如下圖


漫反射

那么s和n的點(diǎn)乘就表示夾角的cos了(有疑惑的翻翻幾何課本),于是就有公式如下


漫反射公式

有了這個(gè)公式狈谊,我們愉快的開始寫代碼吧喜命!

attribute vec3 vertPosition; // Vertex position
attribute vec3 vertNorm; // Vertex normal

varying vec3 lightIntensity; // Light intensity

uniform vec3 lightPosition; // Light position in eye - coordinate
uniform vec3 Kd; // Reflect of diffuse light
uniform vec3 Ld; // Intensity of light

uniform mat3 normMat; // matrix of normal
uniform mat4 modelview; // matrix of modelview
uniform mat4 projection; // matrix of projection

void main() {
    // Convert normal and position to eye coord
    vec3 tnorm = normalize(normMat * vertNorm);
    vec3 eyecoord = vec3(modelview * vec4(vertPosition, 1.0));
    vec3 s = normalize(lightPosition - eyecoord);
    
    // The diffuse shading equation
    lightIntensity = Ld * Kd * max(dot(s, tnorm), 0.0);
    
    gl_Position = projection * modelview * vec4(vertPosition, 1.0);
}

接下來,說代碼吧河劝。
前兩行的attribute變量用于定義頂點(diǎn)坐標(biāo)和頂點(diǎn)法線壁榕,也就是我們屆時(shí)要輸入的值。這里一定要注意赎瞎,這個(gè)shader文件里的處理流程是逐頂點(diǎn)的护桦,就是每次處理一個(gè)頂點(diǎn)變換。
然后定義一個(gè)varying輸出變量煎娇,一會(huì)兒在fragment shader中要用到的二庵。
之后是光源坐標(biāo)Position,這里已經(jīng)轉(zhuǎn)換為觀察坐標(biāo)了缓呛,你也可以在shader里面轉(zhuǎn)換催享。然后就是光照強(qiáng)度La,反射系數(shù)Kd哟绊。
接著定義了法線變換矩陣因妙。這個(gè)東西簡(jiǎn)單講一下。


我扣的圖
類似于圖中的法線票髓,在圖被拉伸(還有旋轉(zhuǎn)什么的攀涵,法線要跟著頂點(diǎn)動(dòng)才對(duì))了之后,法線的方向就錯(cuò)了洽沟,因此需要法線矩陣來變換一下以故。法線矩陣的推導(dǎo)公式就不列出來了,線性代數(shù)我還在復(fù)習(xí)裆操,也講不太好怒详,網(wǎng)上有不少資料,能看懂就好了踪区。剛體變換就用觀察矩陣modelview的左上角3x3就可以了昆烁。
然后定義了觀察變換矩陣和投影變換矩陣。
然后缎岗,雞凍人心的時(shí)刻就到了静尼。
首先我們用法線矩陣變換頂點(diǎn)法向量,觀察矩陣變換頂點(diǎn)坐標(biāo)

    vec3 tnorm = normalize(normMat * vertNorm);
    vec3 eyecoord = vec3(modelview * vec4(vertPosition, 1.0));

然后計(jì)算指向光源坐標(biāo)的向量,并且歸一化

    vec3 s = normalize(lightPosition - eyecoord);

接著鼠渺,就要用到我們上面的公式了

    lightIntensity = Ld * Kd * max(dot(s, tnorm), 0.0);

這個(gè)lightIntensity一會(huì)兒就是我們計(jì)算出來的頂點(diǎn)顏色蜗元。
接下來,使用gl_Position輸出最終經(jīng)過觀察->投影變換后的頂點(diǎn)坐標(biāo)

    gl_Position = projection * modelview * vec4(vertPosition, 1.0);

至此系冗,頂點(diǎn)shader的工作就完成了奕扣。

然后開始處理片段shader了。
上代碼

precision mediump float;

varying vec3 lightIntensity;

void main() {
    gl_FragColor = vec4(lightIntensity, 1.0);
}

其中定義的varying vec3 lightIntensity就是我們?cè)趘ertex shader中計(jì)算出來的光照后的頂點(diǎn)顏色值掌敬。最終賦值給gl_FragColor惯豆,就是頂點(diǎn)的最后顏色了。
然后讓程序跑起來奔害,最終結(jié)果如下

渲染結(jié)果

另外代碼中的ToyMater/ToyTest目錄下是測(cè)試用的楷兽,可以很方便的修修改改的來測(cè)試。

猛戳代碼

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末华临,一起剝皮案震驚了整個(gè)濱河市芯杀,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌雅潭,老刑警劉巖揭厚,帶你破解...
    沈念sama閱讀 222,681評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異扶供,居然都是意外死亡筛圆,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門椿浓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來太援,“玉大人,你說我怎么就攤上這事扳碍√岵恚” “怎么了?”我有些...
    開封第一講書人閱讀 169,421評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵笋敞,是天一觀的道長(zhǎng)碱蒙。 經(jīng)常有香客問我,道長(zhǎng)液样,這世上最難降的妖魔是什么振亮? 我笑而不...
    開封第一講書人閱讀 60,114評(píng)論 1 300
  • 正文 為了忘掉前任巧还,我火速辦了婚禮鞭莽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘麸祷。我一直安慰自己澎怒,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,116評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著喷面,像睡著了一般星瘾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上惧辈,一...
    開封第一講書人閱讀 52,713評(píng)論 1 312
  • 那天琳状,我揣著相機(jī)與錄音,去河邊找鬼盒齿。 笑死念逞,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的边翁。 我是一名探鬼主播翎承,決...
    沈念sama閱讀 41,170評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼符匾!你這毒婦竟也來了叨咖?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,116評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎驰徊,沒想到半個(gè)月后痴腌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,651評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡痴晦,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,714評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了琳彩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片誊酌。...
    茶點(diǎn)故事閱讀 40,865評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖露乏,靈堂內(nèi)的尸體忽然破棺而出碧浊,到底是詐尸還是另有隱情,我是刑警寧澤瘟仿,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布箱锐,位于F島的核電站,受9級(jí)特大地震影響劳较,放射性物質(zhì)發(fā)生泄漏驹止。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,211評(píng)論 3 336
  • 文/蒙蒙 一观蜗、第九天 我趴在偏房一處隱蔽的房頂上張望臊恋。 院中可真熱鬧,春花似錦墓捻、人聲如沸抖仅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)撤卢。三九已至环凿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間放吩,已是汗流浹背智听。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留渡紫,地道東北人瞭稼。 一個(gè)月前我還...
    沈念sama閱讀 49,299評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像腻惠,于是被迫代替她去往敵國(guó)和親环肘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,870評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容