Games101-lecture 09 著色
上一講簡單介紹了插值:
即已知三角形的三個頂點的紋理坐標(biāo)uv,如何知道三角形內(nèi)部的任意一點的uv,這就需要用到插值
插值通俗來講就是已知三角形的三個頂點各自的屬性,將這些屬性在三角形內(nèi)部做一個平滑處理
????????屬性可以有:紋理坐標(biāo)、顏色、法線
(這個可以解釋Unity Shader 入門精要中的逐頂點光照為何會呈現(xiàn)棱角現(xiàn)象)

這一講將上一講的著色講完,有時間再講陰影的部分

一、重心坐標(biāo)
????重心坐標(biāo)定義在一個三角形上面,即用來計算插值,三角形內(nèi)一點x,y可以用三個頂點A,B,C表示:

在這個三角形A、B、C頂點形成的平面內(nèi)任意一點 (x,y)?都可以表示成三個頂點A、B、C它們坐標(biāo)的線性組合(即圖上的式子)
如果三個系數(shù)都是非負(fù)的,那這個點在△ABC內(nèi),否則這個點就是在△ABC所在平面上



用這個重心去連接A、B、C可以得到三個等面積的三角形,從而重心的重心坐標(biāo)為(1/3,1/3,1/3)
注意:重心和重心坐標(biāo)是有區(qū)別的
推導(dǎo)式子--已知A、B、C以及重心的坐標(biāo),求重心的重心坐標(biāo):

知道了重心坐標(biāo)怎么求之后,就可以對三角形內(nèi)部進行插值
三角形任意一點用重心坐標(biāo)來求得其相應(yīng)的屬性

但是投影后的重心坐標(biāo)可能會不一樣,所以如果要在三維三角形內(nèi)插值,要用三維的坐標(biāo)
然后再將值對應(yīng)到二維空間上去
二、應(yīng)用紋理--怎樣將紋理實際運用在渲染中
????屏幕上的任何一個采樣點(通常為采樣點中心),通過所在三角形的頂點們和重心坐標(biāo)進行插值映射出采樣點的紋理坐標(biāo),然后去紋理上查詢一下uv的值對應(yīng)的顏色,然后將顏色賦給漫反射系數(shù)--漫反射的顏色

三、紋理變換(對紋理進行放大或縮小)
1.紋理放大

任何一個點,找到它紋理上的坐標(biāo),如果這個位置不是整數(shù),我們應(yīng)該如何處理?
Nearest鄰近值是對紋理坐標(biāo)做一個簡單的四舍五入的處理,用紋理坐標(biāo)周圍的很多像素合成一個像素(如:3*3,5*5),但缺點是會有鋸齒,倒挺適合做像素游戲

如果要變成中間或右邊圖的樣子--有點模糊,但得到的結(jié)果稍微連續(xù)點
Bilinear雙線性插值是利用周圍鄰近的四個點進行插值,如下四圖所示




Bicubic是用周圍16個點進行插值得到
這三者的區(qū)別可以去視頻上看,Bilinear和Bicubic的區(qū)別可以用女孩眼睛的輪廓觀察出
2.紋理縮小---比紋理放大多的是要對采樣范圍進行查詢
像素縮小會發(fā)現(xiàn)遠(yuǎn)處產(chǎn)生摩爾紋,近處產(chǎn)生鋸齒-----即走樣


近處的一個像素覆蓋的紋理范圍小,遠(yuǎn)處的一個像素覆蓋了很大的紋理范圍,所以遠(yuǎn)處還用中心點代表很大的紋理范圍的像素是不對的
解決方法:遠(yuǎn)處的像素能更多地采樣周圍的樣本

lecture 6 講述了走樣產(chǎn)生的原因:信號變化速度過快(高頻率),采樣速度跟不上信號變換速度,從而發(fā)生走樣
翻譯:如果紋理過大,一個采樣范圍過大,但只以采樣中心點代替這一范圍的紋理,從而發(fā)生走樣(一個像素承載很多信息稱為高頻信息變化)
一個像素內(nèi),它有非常高頻的信號,要想盡量不走樣,就要使用更高頻的采樣方法,這就是為什么一個采樣范圍要許多的采樣點來做到超采樣的方法

但如果不想超采樣呢,然后又能立刻知道這個采樣范圍的平均值是多少?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?--mipmap多級漸遠(yuǎn)紋理
知道采樣范圍平均值這個問題是一個算法問題,無論在數(shù)據(jù)結(jié)構(gòu)、計算幾何等很多領(lǐng)域上都運用這個,這個問題是點插值問題(類似鄰近值)和范圍插值問題(類似Bilinear、Bicubic)
范圍插值問題除了圖形學(xué)里的取平均值,還會應(yīng)用在查詢最大值最小值

mipmap就是由一張圖生成一系列分辨率越來越小的圖,進行存儲

然后摞起來存儲

因為這些mipmap得到的分辨率小的圖像,圖像存儲方面增加了1/3倍的存儲

mipmap要在近似的在一個正方形范圍區(qū)域內(nèi)做范圍查詢,立刻知道這個區(qū)域內(nèi)的平均值是多少
50 :20 --? 55 : 51


但是mipmap存儲的是離散型的0,1,2,3....層圖像,如果有的地方需要1.8層圖像呢:再用插值就好了(對于圖中不同層的紋理,使用插值(三線性插值)再進行過渡)

采樣點在mipmap低一層時運用Bilinear得到插值,再在高一層運用Bilinear得到插值,最后用這兩層的插值再進行插值,得到結(jié)果,一共三個步驟,叫做三線性插值

mipmap的限制:

mipmap+trilinear出現(xiàn)了overbur的情況,是因為mipmap只能查詢正方形,trilinear第三步驟也是近似插值
mipmap+trilinear所產(chǎn)生的這個問題,用各向異性過濾可以部分解決

各向異性過濾使用了Ripmap,Ripmap將圖片根據(jù)橫軸豎軸寬長各除以一半
這能將不同長寬比的圖片進行分辨減小的預(yù)存儲,是mipmap沒有的,開銷是mipmap的3倍


屏幕上的一個像素投影到紋理圖像上,很有可能各是不同的不規(guī)則的形狀
如果這個時候用mipmap這樣只能用方形的采樣范圍采樣,就會產(chǎn)生overbur的情況
而Ripmap則可以對圖中長條形的范圍進行快速查詢
但Ripmap仍然有限制,比如圖中最大的那個斜著的矩形是不能很好查詢
(因為Ripmap只是長寬可以調(diào)整,但范圍的角度不能調(diào)整,不能把豎直的矩形范圍變成傾斜的)
那么就可用EWA過濾的方法可以解決這個不能傾斜的問題

但代價是用空間換質(zhì)量
這節(jié)要累死了?。╠ie)