Metal入門資料014-渲染燈光效果和3D效果

寫在前面:

對Metal技術(shù)感興趣的同學(xué),可以關(guān)注我的專題:Metal專輯
也可以關(guān)注我個人的簡書賬號:張芳濤
所有的代碼存儲的Github地址是:Metal

正文

讓我們來看看第13部分中我們離開的地方惭笑。使用我們上次工作的同一個Playground赠摇,我們今天將學(xué)習(xí)照明和3D物體谆焊。 還記得我們幾周前做過的日食嗎寂恬? 它回來了兔魂! 好吧趾浅,我們要去除太陽弛作,這次只關(guān)注地球涕蜂。

首先,讓我們清理我們的內(nèi)核只包含這些代碼:

int width = output.get_width();
int height = output.get_height();
float2 uv = float2(gid) / float2(width, height);
uv = uv * 2.0 - 1.0;
float radius = 0.5;
float distance = length(uv) - radius;
output.write(distance < 0 ? float4(1) : float4(0), gid);

幾個星期前你肯定會認出這些代碼映琳。 我們唯一做的是用黑色替換外圈顏色机隙,用白色替換內(nèi)圈顏色。 輸出圖像應(yīng)如下所示:

效果圖

到現(xiàn)在為止還挺好萨西。 這個星球看起來很平坦有鹿,照明分布太均勻,看起來不真實谎脯。 我們接下來解決這個問題吧葱跋。 幾何學(xué)告訴我們,為了找到球體上的任何點源梭,我們需要球體方程:

(x - x_0)^2 + (y - y_0)^2 + (z - z_0)^2 = r^2

在我們的特殊情況下娱俺,x0,y0和z0都是0咸产,因為我們的球體位于屏幕的中心矢否。 求解z給出了行星顏色的值,所以讓我們用這些行替換內(nèi)核中的最后一行:

float planet = float(sqrt(radius * radius - uv.x * uv.x - uv.y * uv.y));
planet /= radius;
output.write(distance < 0 ? float4(planet) : float4(0), gid);

顯示的效果如下:

效果圖

正如您所料脑溢,現(xiàn)在計算的顏色從圓心開始以全白色開始僵朗,在外圓上以全黑結(jié)束。 為了實現(xiàn)這一點屑彻,我們不得不將顏色除以半徑验庙,以便將我們的范圍標(biāo)準(zhǔn)化為z值的[0,1]間隔,從而為我們提供全范圍的光效社牲。 我們實際上假裝光源位于(0,0,1)粪薛。 這引出了下一個主題:lighting

Lighting是賦予我們色彩生命的東西搏恤。 為了在場景中有燈光违寿,我們需要計算每個坐標(biāo)的'normal'(法線)。 法線向量在表面上垂直熟空,向我們顯示表面在每個坐標(biāo)處“指向”的位置藤巢。 用這些行替換最后兩行:

float3 normal = normalize(float3(uv.x, uv.y, planet));
output.write(distance < 0 ? float4(float3(normal), 1) : float4(0), gid);

請注意,我們已經(jīng)在行星變量中得到了z的值息罗。 輸出圖像應(yīng)如下所示:

效果圖

這可能不是我們想要看到的掂咒,但至少我們現(xiàn)在知道在計算每個標(biāo)準(zhǔn)化坐標(biāo)處的顏色時法線是什么樣的。 接下來,讓我們創(chuàng)建一個位于左側(cè)(負x)和稍后位置(正z)的光源绍刮。 用這些行替換最后一行:

float3 source = normalize(float3(-1, 0, 1));
float light = dot(normal, source);
output.write(distance < 0 ? float4(float3(light), 1) : 
float4(0), gid);

我們采用了一種稱為Lambertian
(漫射)光的基本光模型温圆,我們需要將法線與標(biāo)準(zhǔn)化光源相乘。 我們將在以后的文章中詳細討論Lighting孩革,但是岁歉,如果您有興趣了解有關(guān)照明模型的更多信息,這里有一個很好的資源供您參考嫉戚。 輸出圖像應(yīng)如下所示:

效果圖

還記得上次我們的內(nèi)核還給我們一個統(tǒng)一的計時器嗎刨裆? 用這個替換源代碼行:

float3 source = normalize(float3(cos(timer), sin(timer), 1));

通過使用cossin函數(shù),我們給光源一個圓周運動彬檀。 使用圓的參數(shù)方程帆啃,xy都在-11的范圍內(nèi)。 輸出圖像應(yīng)如下所示:

效果圖

我們?nèi)绾卧趫鼍埃ㄌ炜罩械男行牵┲锌吹狡恋恼彰魑矬w窍帝,然而努潘,物體仍然呈現(xiàn)出均勻的表面。 我們可以通過兩種方式使其看起來更逼真:要么對其應(yīng)用紋理坤学,要么為行星顏色添加一些噪點疯坤。 源代碼點擊我

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市深浮,隨后出現(xiàn)的幾起案子宝穗,更是在濱河造成了極大的恐慌警绩,老刑警劉巖旋膳,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件收夸,死亡現(xiàn)場離奇詭異,居然都是意外死亡布卡,警方通過查閱死者的電腦和手機雨让,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來忿等,“玉大人栖忠,你說我怎么就攤上這事∶辰郑” “怎么了庵寞?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長薛匪。 經(jīng)常有香客問我捐川,道長,這世上最難降的妖魔是什么蛋辈? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上冷溶,老公的妹妹穿的比我還像新娘渐白。我一直安慰自己,他們只是感情好逞频,可當(dāng)我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布纯衍。 她就那樣靜靜地躺著,像睡著了一般苗胀。 火紅的嫁衣襯著肌膚如雪襟诸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天基协,我揣著相機與錄音歌亲,去河邊找鬼。 笑死澜驮,一個胖子當(dāng)著我的面吹牛陷揪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播杂穷,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼悍缠,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了耐量?” 一聲冷哼從身側(cè)響起飞蚓,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎廊蜒,沒想到半個月后趴拧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡劲藐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年八堡,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片聘芜。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡兄渺,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出汰现,到底是詐尸還是另有隱情挂谍,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布瞎饲,位于F島的核電站口叙,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏嗅战。R本人自食惡果不足惜妄田,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一俺亮、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧疟呐,春花似錦脚曾、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至鲁冯,卻和暖如春拷沸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背薯演。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工撞芍, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人涣仿。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓勤庐,卻偏偏與公主長得像,于是被迫代替她去往敵國和親好港。 傳聞我的和親對象是個殘疾皇子愉镰,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,914評論 2 355

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