第九作坊中的畫素光照實現

2021-04-13 12:41:40 字數 2207 閱讀 3731

畫素光照

與固定管線不同,使用可程式設計管線可以實現靈活多樣的渲染效果。然而事物總有兩面,使用可程式設計管線就必須編寫shader程式。本節的內容將以分析實現各種效果的shader為主,在此之前有必要簡單說明shader的使用方法。下面的偽**說明了如何使用id3dxeffect介面執行shader程式。

使用d3dxcreateeffectfromfile讀取並編譯shader

使用effect->begin設定渲染狀態

使用effect->beginpass裝入當前pass的shader程式①

渲染需要渲染的東西②

使用effect->endpass清空裝入的shader①

使用effect->end恢復渲染狀態

①beginpass/endpass是在開始和結束乙個 pass時必須執行的操作,由於無法得知其內部實現,它的具體功能只是一種推測。

②這裡渲染的實體都將「通過」當前的shader,d3d會自動的將頂點緩衝的資訊在適當的時候裝入相應的暫存器。shader中就可以通過訪問暫存器訪問這些資料了。

畫素光照

光照處理一直是遊戲中十分搶眼的部分,真實眩目的光照效果往往可以將遊戲的影象效果提公升乙個檔次。畫素光照是指畫素級別的光照,即每個畫素都將執行光照運算,其產生的效果遠遠超過頂點級別的光照。在ffp中只能使用頂點光照。正如前面提到的,shader分為vs,ps兩種,vs將對每個頂點執行,而ps則為每個畫素執行。乙個effect物件可以封裝多個vs、ps。下面的shader程式使用hlsl編寫,實現了具有環境光、漫反射、鏡面反射的光照效果。

struct vs_input ;

struct vs_output ;

vs_output vs_main( vs_input input )② ⑪

struct ps_input

;float4 ps_main(ps_input input) : color0 ⑫

⑧將環境光和物體材質混合,並乘以環境光係數(ka,kd,ks分別為光源的環境光係數、漫反射係數、鏡面反射係數、具體數值由應用程式設定)。

⑨計算漫反射強度,使用公式:d=(-n.l) 式中:

d——漫反射強度;n——法線向量;l——光線向量;

再將光源的漫反射顏色和材質混合,並乘以漫反射強度和漫反射係數。

⑩計算鏡面反射強度,使用公式:(r.v)^ns,式中:

r——反射向量;ns——鏡面反射指數;v——觀察方向;

ns越大表示物體表面越光滑鏡面反射的強度越大,同時光照面積越小;v可以利用觀察者的位置和當前頂點位置求出。**中乘以max(0, -dotnlinworld/abs(dotnlinworld))的作用是:保證只有當n.l為負的時候才會出現鏡面反射,否則鏡面反射為0。因為當n.l為正時意味著n和l同向,所以此時當前畫素在物體的背光面,不會發生鏡面反射。

⑪  將vs_output結構返回。

⑫  這裡是ps主過程,定義了輸入變數和輸出變數。和vs不同的是ps的輸出變數必須為float4,該值將會傳遞到渲染流水線的下乙個階段進行alphablend等運算,並最終輸出到螢幕上。另外,ps中的輸入資料一般是從vs的輸出中獲得的,但是在vs、ps之間並不是直接的引數傳遞。從3.2節開始處的圖2-4可以看出vs、ps之間還有乙個叫做primitive processing的過程,該過程中處理實體資訊,包括對每個頂點的vs輸出進行插值,並送入ps的輸入暫存器。所以,ps的輸入就是當前畫素所在三角形的各個頂點的vs輸出的插值結果。在本程式中vs輸出的3個顏色值都會經歷這個過程並送到ps中。這樣的最大好處是:將大量的運算放在vs中,運算結果交給ps使用。由於vs的執行效率比ps高的多,大大加快了處理速度,同時由於ps的輸入是在頂點間「平滑」過度的,所以不用擔心產生多邊形之間出現「顏色突變」的現象。

⑬  對紋理貼圖取樣。取樣是指:根據給出的貼圖座標按照一定的方式取出指定貼圖的顏色值。這裡使用2d取樣取得與當前畫素對應的顏色值。

⑭  最終,將所有的三種顏色迭加在一起,並用lightpower控制光照的整體強度。

上圖展示了畫素光照的渲染效果。

圖a,c光照方向均沿著x軸正方向。

圖b環境光係數,漫反射係數,鏡面反射係數,鏡面反射指數分別設定為0.1,1, 0,2。其他各圖設定均為0.1,1,1,2。

圖a,b,d分別為不同角度的觀察結果.

通過上面的shader**,介紹了實現畫素光照的方法以及vs,ps之間傳遞引數的方法.

第九節 Quartz中的作業

做為使用quartz的我們,其實最關心的就job,job裡面會實現我們要執行的業務 相對於排程器觸發器來講,job相對簡單一些。先睹圖為快 我們繼承ijob介面定義的job會被封裝到 jobdetailimpl 中,jobdetailimpl 還包括其它屬性,比如唯一標識job的jobkey 如上圖...

第九周 對稱矩陣壓縮儲存的實現

all right reserved.date 2015年10月26日 版本 v1.0.1 作業系統 xp 執行環境 vc6.0 問題描述 對稱矩陣壓縮儲存的實現 用壓縮形式儲存對稱矩陣,實現下面的操作並測試 void init int b 為n階對稱矩陣初始化儲存資料的一維陣列b int valu...

第九周(專案一) 實現複數類中的運算子過載。

02.02.煙台大學計算機學院學生 03.03.all right reserved.04.04.檔名稱 煙台大學計算機學院學生 05.05.all right reserved.06.06.檔名稱 實現複數類中的運算子過載 08.08.完成日期 2013年4月22日 09.09.版本號 v1.0 ...