好的,我們來(lái)總結(jié)一下Lesson 7主要干了些什么馁痴?
它完成了陰影貼圖的效果翼岁,也就是讓我們渲染的人物模型,有了陰影的存在培廓。
我們來(lái)看下下面兩張圖——
可能大家看到人物右邊的臉都比較暗,這個(gè)因?yàn)槲覀冄劬吹奈恢盟绊懙拇航校?strong>并不是陰影肩钠。我們所渲染出的陰影,是下面highlight的部分——
那么好象缀,它是怎么實(shí)現(xiàn)的呢蔬将?
做一個(gè)兩步渲染!
所謂的兩步渲染央星,并不是說(shuō)單純地渲染兩遍霞怀,而是使用兩個(gè)著色器分別渲染一遍。
第一步渲染的著色器是深度著色器莉给,稱它為depthbuffer毙石。
第二步渲染的著色器是著色器,稱它為shader颓遏。
二者的區(qū)別在哪里呢徐矩?
首先,depthShader中叁幢,相機(jī)的位置是放在光源位置的滤灯,這樣我們可以得到模型的哪些部分可以被光照亮,而哪些部分被自身遮擋曼玩,會(huì)產(chǎn)生陰影鳞骤。
我們通過(guò)depthShader可以得到下圖——
通過(guò)上圖,我們得知黍判,看到的地方豫尽,都是亮的,看不到的顷帖,都或多或少的有些陰影美旧。(可以看看一開(kāi)始放出的圖渤滞,就能明白了)
好,我上面說(shuō)了榴嗅,我們的兩步渲染妄呕,不是單純的渲染兩遍。
我們得想辦法录肯,
將上面depthShader得到的可見(jiàn)度區(qū)域的信息傳遞給下一個(gè)著色器趴腋,
這樣,第二遍渲染結(jié)束论咏,我們才可以得到有陰影的圖。
那么如何傳遞呢颁井?——指針
具體操作是這樣厅贪,我們將shadowbuffer放進(jìn)triangle()函數(shù)中,triangle()函數(shù)通過(guò)指針來(lái)修改triangle()函數(shù)中zbuffer中的值雅宾,而正好當(dāng)?shù)诙€(gè)著色器shader在再一次調(diào)用triangle()函數(shù)的時(shí)候养涮,里面使用的就是zbuffer。
也就是說(shuō)眉抬,我們?cè)赿epthShader中保留了z緩沖區(qū)贯吓,它由shadowbuffer指針指向。這個(gè)DepthShader著色器輕易地將z緩沖區(qū)復(fù)制到幀緩沖區(qū)中蜀变,然后在第二次渲染的時(shí)候悄谐,我們就保留了之前的深度信息。
我們來(lái)康康代碼:
triangle(screen_coords, depthshader, depth, shadowbuffer);
void triangle(Vec4f* pts, IShader& shader, TGAImage& image, float* zbuffer)
triangle(screen_coords, shader, frame, zbuffer);
因?yàn)長(zhǎng)esson 7提到了幀緩沖库北,一開(kāi)始不太明白爬舰,這里補(bǔ)充下——
幀緩沖器對(duì)屏幕每一點(diǎn)都有存儲(chǔ)強(qiáng)度/顏色信息的能力。在幀緩存中寫RGB就是在屏幕上畫(huà)顏色寒瓦。
緩沖器中的單元個(gè)數(shù)情屹,和屏幕上可以顯示的像素總數(shù),至少是一樣的杂腰。也可以更多垃你。