專利名稱:一種視野驅(qū)動(dòng)的實(shí)時(shí)陰影方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種三維虛擬環(huán)境中的實(shí)時(shí)陰影方法,特別一種視野驅(qū)動(dòng)的實(shí)對(duì)陰影方法。
背景技術(shù):
在當(dāng)前研究的基于陰影圖的實(shí)時(shí)陰影繪制方法中,針對(duì)經(jīng)典陰影圖方法陰影應(yīng)用于場(chǎng)景 繪制中陰影走樣問題的研究方法,主要分為兩大類。第一大類是以Perspective Shadow Maps (PSM)為基礎(chǔ),這類方法都是通過對(duì)陰影圖重新參數(shù)化來進(jìn)行反走樣。另外一類方法是以 Adaptive Shadow Maps (ASM)為基礎(chǔ),這類方法的基本思想是提高陰影圖的分辨率,來達(dá) 到反走樣的目的。
PSM方法把場(chǎng)景和光源都變換到后投影空間并生成陰影圖。通過變換,距離視點(diǎn)近的物 體被放大,距離視點(diǎn)遠(yuǎn)的物體被縮小。陰影圖的生成也是在后投影空間,距離視點(diǎn)近的物體 在陰影圖上所占的比率也就更大,采樣更精細(xì)。之后的Trapezoidal Shadow Maps (TSM)和 Light Space Perspective Shadow Maps (LiSPSM)對(duì)PSM又做出了進(jìn)一步的改進(jìn)。這類方法都 顯著地減少了透視走樣,卻不能減少投影走樣,而且反走樣的效果,受到光源和視點(diǎn)位置的 影響很大,很難應(yīng)用于大規(guī)模場(chǎng)景中的實(shí)時(shí)陰影生成。
ASM通過把陰影圖組織成一種四叉樹的層次結(jié)構(gòu)來減少陰影的走樣。對(duì)于場(chǎng)景中陰影容 易走樣的區(qū)域,利用高分辨率的陰影圖來映射,增加其采樣率。該方法在當(dāng)前的硬件條件下, 很難做到實(shí)時(shí)繪制。利用GPU實(shí)現(xiàn)了該方法,但仍然很難滿足復(fù)雜場(chǎng)景下的實(shí)時(shí)陰影繪制的 需要。Resolution-Matched Shadow Maps (RMSM)是的一種改進(jìn)實(shí)現(xiàn)方法,利用GPGPU技 術(shù)來實(shí)現(xiàn)陰影生成的并行計(jì)算,利用該方法繪制出陰影的效果較好,但速度依然不快。Queried Virtual Shadow Maps (QVSM)和Fitted Virtual Shadow Maps (FVSM)作為兩種ASM最新的 改進(jìn)方法,都是將原始的陰影圖進(jìn)行動(dòng)態(tài)四叉樹劃分,對(duì)于場(chǎng)景中陰影容易走樣的區(qū)域,利 用高分辨率的陰影圖來映射。這兩種方法都克服了 ASM中所需要復(fù)雜的數(shù)據(jù)結(jié)構(gòu)的缺點(diǎn), 在當(dāng)前主流顯卡下,能夠?qū)崟r(shí)繪制出反走樣的陰影。但每繪制一幀圖像,需要繪制多幅陰影 圖,速度受到了影響。Practical Shadow Mapping (PrSM)同本發(fā)明的方法最接近,同本發(fā)明 的方法相比,PrSM獲取整個(gè)視椎體的包圍盒,再在該包圍盒內(nèi)生成陰影圖并映射到場(chǎng)景中去。 陰影圖的大小受到視椎體的參數(shù)的影響,當(dāng)視椎體的范圍超出了視野所能夠看到的場(chǎng)景的范 圍的時(shí)候,就會(huì)造成陰影圖的無效渲染,影響陰影的質(zhì)量。Parallel-Split Shadow Maps (PSSM)
可以看做PrSM的一種改進(jìn),該方法沿著視點(diǎn)的方向,將視椎體劃分成若干個(gè)子視椎體,在 光源坐標(biāo)系下分別為每個(gè)子視椎體計(jì)算包圍盒并繪制一張獨(dú)立的子陰影圖映射到場(chǎng)景里,生 成實(shí)時(shí)陰影。這種方法和QVSM和FVSM—樣,需要繪制多張陰影圖,陰影的繪制速度受到 了影響
發(fā)明內(nèi)容
.
本發(fā)明的技術(shù)解決問題克服現(xiàn)有技術(shù)的不足,提供一種視野驅(qū)動(dòng)的實(shí)時(shí)陰影方法,該 方法同時(shí)具有繪制速度快,能夠繪制出高質(zhì)量的陰影。
本發(fā)明的技術(shù)解決方案 一種視野驅(qū)動(dòng)的實(shí)時(shí)陰影方法,包括以下步驟
a. 把視野反投影到光源平面產(chǎn)生投影區(qū)域,為該投影區(qū)域生成一個(gè)二維的AABB包圍 盒;所述的視野是指從視點(diǎn)位置出發(fā),能夠看到的陰影接收體的范圍;
b. 在所述的AABB包圍盒范圍內(nèi)生成陰影c. 將該陰影圖映射到場(chǎng)景中生成陰影。
所述的步驟a中生成一個(gè)二維的AABB包圍盒后,判斷該AABB包圍盒是否需要分裂 成為兩個(gè)子AABB包圍盒,若需要,則分裂該AABB包圍盒,以使后續(xù)產(chǎn)生的陰影圖反走樣 效果質(zhì)量高。
所述的需要分裂的過程分為判斷是否需要分裂和進(jìn)行分裂的兩個(gè)過程;
其中判斷過程為首先計(jì)算出陰影圖利用率v,在光源平面上為視野投影所得到的投影 區(qū)域求得其AABB包圍盒,分別求出投影區(qū)域的面積^和AABB包圍盒的面積Sr兩者的比 值Sp/Sr即為v,設(shè)定一個(gè)所需要的閾值q,當(dāng)v〈 il的時(shí)候,需要把二維AABB包圍盒分 裂成兩個(gè)子AABB包圍盒;
進(jìn)行分裂的過程為求得投影區(qū)域的兩條對(duì)角線的交點(diǎn)C,選取C作為AABB包圍盒分 裂的基準(zhǔn)點(diǎn),從C點(diǎn)出發(fā)繪制兩條分別平行于AABB包圍盒的邊,并且該兩邊相互垂直,然 后從其中的一條直線出發(fā),把投影區(qū)域分成兩個(gè)多邊形,再分別對(duì)這兩個(gè)多邊形求出兩個(gè)子 AABB包圍盒,并求出兩個(gè)子AABB包圍盒的面積和S1,重復(fù)以上方法,對(duì)于另一條直線同 樣也可以得到兩個(gè)子AABB包圍盒及二者的面積和S2,比較S1和S2的大小,選取兩者中 的較小值所對(duì)應(yīng)的邊為最終的分裂邊。
所述的步驟a把視野反投影到光源平面產(chǎn)生投影區(qū)域的過程為
(1) 從視點(diǎn)位置繪制出視野;
(2) 利用下述計(jì)算公式將視野反投影到光源平面產(chǎn)生投影區(qū)域
<formula>formula see original document page 6</formula>其中(X,y,Z)為視野范圍中的某個(gè)任意片元尸的坐標(biāo),(X',少〕為視野范圍中的某
、任意片元尸在光源平面上的投影P '的坐標(biāo), 和W£yeM^/WeW分別表示光源
坐標(biāo)系下的模型視點(diǎn)矩陣和視點(diǎn)坐標(biāo)系下的模型視點(diǎn)矩陣的逆陣。 本發(fā)明與經(jīng)典的陰影圖方法相比的優(yōu)點(diǎn)在于-
(1) 能夠繪制出高質(zhì)量的陰影 本發(fā)明把視野反投影到光源平面產(chǎn)生投影區(qū)域,為該投影區(qū)域生成一個(gè)二維的包圍盒,
這樣有了包圍盒,陰影圖的繪制僅僅局限于包圍盒內(nèi),避免了場(chǎng)景中不必要的陰影繪制,提 高了陰影圖的利用率,'反走樣的效果好,使繪制出的陰影的效果大大提高。
(2) 具有繪制速度快,實(shí)時(shí)性強(qiáng) 本發(fā)明的整個(gè)過程僅只需要繪制一到兩幅陰影圖,實(shí)時(shí)性強(qiáng),可以滿足一個(gè)上百萬面片
的大規(guī)模場(chǎng)景中實(shí)時(shí)陰影繪制的需要。
圖1為本發(fā)明的視野和視椎體的區(qū)別; 圖2A為本發(fā)明生成視野并反投影的過程示意圖; 圖2B為本發(fā)明反投影區(qū)域生成AABB包圍盒的示意圖; 圖3為本發(fā)明中陰影的生成過程; 圖4A為本發(fā)明AABB包圍盒垂直分裂過程示意圖; 圖4B為本發(fā)明AABB包圍盒水平分裂過程示意圖; 圖5為本發(fā)明方法具體實(shí)現(xiàn)步驟。
具體實(shí)施例方式
如圖5所示,本發(fā)明具體實(shí)現(xiàn)步驟如下
步驟S501,在步驟S501中,把視野201反投影到光源平面202,在光源平面202為視野 201生成一個(gè)二維的AABB包圍盒204。
本發(fā)明的視野和視椎體不同,是指從視點(diǎn)位置出發(fā),能夠看到的朋影接收體的范圍。圖
1表示了視野和視椎體的區(qū)別,視椎體101是圖形學(xué)上標(biāo)準(zhǔn)的視椎體概念,由投影變換矩陣 所決定,深度范圍一直從前剪裁面1011延伸到后剪裁面1012。而本發(fā)明的視野103,指的是 視點(diǎn)102所能夠f到的場(chǎng)景中最遠(yuǎn)的范圍,在圖1中用網(wǎng)格線標(biāo)出。
由于是平行光源,可以認(rèn)為在世界空間中,存在一個(gè)無限大的矩形光源平面。場(chǎng)景中的 每條光線,都是由該平面沿著垂直于該平面的方向發(fā)出的射線。
矩形光源平面的四條邊的方向由光源坐標(biāo)系下的模型視口矩陣和投影矩陣來決定。矩形 光源平面的四條邊在世界坐標(biāo)系中的方向,分別和利用標(biāo)準(zhǔn)陰影圖方法,從光源位置繪制場(chǎng) 景的前剪裁面矩形的四條邊在世界坐標(biāo)系中的方向一致。
由圖1可知,當(dāng)前的視點(diǎn)102所能看到的區(qū)域,都在視野103中,只要在視野103中繪 制出正確的陰影即可。在視野103之外的場(chǎng)景中,繪制出的陰影也是無效的。在陰影圖分辨 率固定的情況下,在視野103中增大陰影圖的利用率,成為了本發(fā)明反走樣的關(guān)鍵。
視野的求法
為了獲取視野范圍,需要得到當(dāng)前視椎體范圍內(nèi)距離視點(diǎn)最遠(yuǎn)的片元的坐標(biāo)信息。本發(fā) 明的求法是分別把深度緩存的初始值和深度測(cè)試的比較函數(shù)調(diào)整成glClearDepth(O.O)和 glDepthFunc(GL一GEQUAL),此時(shí)場(chǎng)景中的可見部分是都是距離視點(diǎn)最遠(yuǎn)的區(qū)域。這些區(qū)域 即為本發(fā)明的"視野"范預(yù)。
視野向光源平面投影的計(jì)算
對(duì)于視野范圍中的某個(gè)任意片元尸,其在視點(diǎn)坐標(biāo)系下的位置為o,少,z;)。其在光源
平面上的投影P加坐標(biāo)0',y')的計(jì)算公式為
<formula>formula see original document page 7</formula>(1)
其中,^丄妙,M^e/v^和附fi^M^/vfew分別表示光源坐標(biāo)系下的模型視點(diǎn)矩陣和視點(diǎn)坐 標(biāo)系下的模型視點(diǎn)矩陣的逆陣。
圖2A所示為視野范圍向光源平面投影的過程。圖2B所示為在光源平面上投影區(qū)域的 AABB包圍盒的示意圖。為了盡可能地增大陰影圖的利用率,本發(fā)明將.視野區(qū)域201沿著光
源方向投影到光源平面上,在光源平面202上得到一塊四邊形的投影區(qū)域203。如圖2B所示, 在光源平面202上,求得投影區(qū)域203的AABB包圍盒(Axis Aligned Bounding Box) 204。 投影的AABB包圍盒的計(jì)算
視野是以一張紋理存儲(chǔ)在顯存中的。然而現(xiàn)在的GPU是不能那么智能地通過這張紋理來 計(jì)算出視野的范圍的,需要把本步轉(zhuǎn)移到CPU中去計(jì)算。然而,如果把整張紋理數(shù)據(jù)從顯存 上傳輸?shù)絻?nèi)存上,會(huì)嚴(yán)重影響到實(shí)時(shí)計(jì)算的效率(例如圖像窗口大小為1024*768,片元每個(gè) 位置用4*32位浮點(diǎn)數(shù)來表示,每繪制一幀就需要從顯存向內(nèi)存?zhèn)鬏?2MB的數(shù)據(jù))。本發(fā)明 使用了一個(gè)小技巧,先通過RTT技術(shù),把這張紋理的四個(gè)角渲染到一張2*2大小的紋理中, 再把這張2*2的紋理傳輸?shù)? 11上,利用四個(gè)角組成視野的四邊形。計(jì)算出它們?cè)诠庠雌矫?上的投影,并計(jì)算二維AABB包圍盒。
在步驟S501中生成一個(gè)二維的AABB包圍盒后,還可以判斷該AABB包圍盒是否需要 分裂成為兩個(gè)子AABB包圍盒,若需要,則分裂該AABB包圍盒,以使后續(xù)產(chǎn)生的陰影圖反 走樣效果質(zhì)量高。分裂的過程分為判斷是否需要分裂和如何進(jìn)行分裂的兩個(gè)過程。
圖4所示為AABB包圍盒分裂過程示意圖。
當(dāng)視線和陰影接收體夾角較小的時(shí)候,視野范圍的跨度較大,向光源平面投影所得到的 四邊形變得狹長(zhǎng),繪制所得到的AABB包圍盒也較大,陰影圖的利用率變得低下,造成了陰 影走樣。受到PSSM方法的啟發(fā),本發(fā)明采用一種陰影圖分裂的方法來解決上面所遇到的問 題。
判斷是否需要分裂為首先計(jì)算出陰影圖利用率v。在光源平面上為視野投影所得到的 投影區(qū)域203求得其AABB包圍盒204,分別求出二者的面積&和&。其二者的比值Sp/& 即為v。很顯然,v越小,陰影反走樣的效果就越差。設(shè)定一個(gè)閾值n (11在50%到100%之 間,本發(fā)明選取閾值11為60%),當(dāng)v〈 i]的時(shí)候,把AABB包圍盒R分裂成兩個(gè)子AABB 包圍盒R1和R2。
具體進(jìn)行分裂的過程如下求得投影區(qū)域203的兩條對(duì)角線的交點(diǎn)C,選取C作為包圍 盒204分裂的基準(zhǔn)點(diǎn)。從C點(diǎn)出發(fā)可以做兩條分別平行于AABB包圍盒204的邊,并且相互 垂直的直線。首先從其中的一條直線a出發(fā),把投影區(qū)域203分成兩個(gè)多邊形2031和2032, 再分別對(duì)這兩個(gè)多邊形2031和2032求出AABB包圍盒2041和2042,并求出AABB包圍盒 2041和2042的面積和Sl。重復(fù)以上方法,對(duì)于另一條直線6同樣也可以得到兩個(gè)AABB包 圍盒2043和2044及二者的面積和S2。比較Sl和S2的大小,選取兩者中的較小值所對(duì)應(yīng)的
邊為最終的分裂邊。這種做法的依據(jù)仍然是把包圍盒做得更加緊致,增大陰影圖的利用率。 AABB包圍盒204分裂成兩個(gè)子AABB包圍盒2041和2042 (或2043和2044)之后,
再按照?qǐng)D2A和圖2B的方法,分別在這兩個(gè)子AABB包圍盒2041和2042 (或2043和2044)
中繪制陰影圖,并分別映射到場(chǎng)景中,生成實(shí)時(shí)陰影。
在步驟S502中,生成陰影圖,陰影圖所覆蓋的范圍僅僅在AABB包圍盒204內(nèi)。 繪制陰影圖的過程如下,把視點(diǎn)位置調(diào)整到光源所在的位置,投影模式改為正交投影 (Ortho2D),正交投影的上下左右四條邊和AABB包圍盒的四條邊重合。這樣就可以保證繪
制的陰影圖所覆蓋的范圍僅僅在AABB包圍盒內(nèi)。
在步驟S503中,將陰影圖映射到場(chǎng)景中生成陰影。
在此步驟中,根據(jù)光源平面上的二維AABB包圍盒,從光源位置繪制陰影圖;最后利用 延時(shí)陰影的方法,繪制出最終的結(jié)果。
延時(shí)陰影方法是延時(shí)著色(Deferred Shading)方法的一種變種方法。其好處是在多幅陰 影圖映射到場(chǎng)景中的時(shí)候,可以減少繪制場(chǎng)景的次數(shù),以此來提高實(shí)時(shí)繪制速度。場(chǎng)景中的 片元通過了各種測(cè)試,最終形成了屏幕上的像素以后,再對(duì)這些像素進(jìn)行陰影著色計(jì)算。
延時(shí)陰影方法的第一步利用多重渲染到紋理(Multiple Render To Texture)技術(shù),從視點(diǎn) 位置繪制場(chǎng)景,把場(chǎng)景中片元的顏色值和相對(duì)于視點(diǎn)位置的坐標(biāo)值分別保存在兩張紋理中; 第二步和經(jīng)典的陰影圖方法一致,從光源位置出發(fā)繪制場(chǎng)景,并把相對(duì)于光源位置的片元的 深度值保存在一張陰影圖中;第三步首先繪制一個(gè)滿屏的四邊形,講從試點(diǎn)位置渲染的到的 顏色紋理映射到該四邊形上。對(duì)于顏色紋理中的每個(gè)像素,從位置紋理中取出它的位置信息, 把位置信息通過矩陣坐標(biāo)變換,變換到光源坐標(biāo)系下,同陰影圖中存儲(chǔ)的深度值進(jìn)行比較, 以確定該片元是否處于陰影中。對(duì)于處于陰影中的片元,進(jìn)行陰影著色處理;對(duì)于處于陰影 外的片元,保持其顏色不變。
圖3所示為陰影的生成過程。本發(fā)明中僅僅對(duì)得到的投影區(qū)域203的AABB包圍盒204 的范圍內(nèi)繪制陰影圖并映射到場(chǎng)景中生成陰影301 (如圖3所示)。利用這種陰影圖的繪制方 法,在視野范圍內(nèi),最大程度地縮小了陰影圖所覆蓋的場(chǎng)景范圍。在陰影圖分辨率不變的條 件下,最大限度地減少了陰影圖中每個(gè)紋元所映射的片元數(shù),來獲得反走樣的效果。
利用陰影圖繪制陰影的過程如下從視點(diǎn)位置繪制場(chǎng)景,對(duì)于場(chǎng)景中的每個(gè)片元,假設(shè) 其坐標(biāo)為(x,^z)。利用矩陣變換,變換到光源坐標(biāo)系下,得到坐標(biāo)為(;c', , z')。與存儲(chǔ)在陰 影圖中的對(duì)應(yīng)的值相比較。如果片元的深度值大于存儲(chǔ)在陰影圖中的深度值,說明該片元和
光源之間有遮擋物,該片元處于陰影中,對(duì)該片元進(jìn)行陰影著色處理;否則,該片元處于陰 影外。
本發(fā)明方法的編寫利用OpenGL圖形庫(kù)結(jié)合GLSL著色語(yǔ)言,在VC2005環(huán)境下實(shí)現(xiàn)的。 雖然本發(fā)明己以較佳實(shí)施例揭露如上,然其并非用以限定本發(fā)明。本發(fā)明所屬技術(shù)領(lǐng)域
中具有通常知識(shí)者,在不脫離本發(fā)明的精神和范圍內(nèi),當(dāng)可作各種的更動(dòng)與潤(rùn)飾。因此,本
發(fā)明的保護(hù)范圍當(dāng)視權(quán)利要求書所界定者為準(zhǔn)。
權(quán)利要求
1、一種視野驅(qū)動(dòng)的實(shí)時(shí)陰影方法,其特征在于步驟如下a. 把視野反投影到光源平面產(chǎn)生投影區(qū)域,為該投影區(qū)域生成一個(gè)二維的AABB包圍盒;所述的視野是指從視點(diǎn)位置出發(fā),能夠看到的陰影接收體的范圍;b. 在所述的AABB包圍盒范圍內(nèi)生成陰影圖;c. 將該陰影圖映射到場(chǎng)景中生成陰影。
2、 根據(jù)權(quán)利要求1所述的視野驅(qū)動(dòng)的實(shí)時(shí)陰影方法,其特征在于所述的步驟a中生 成一個(gè)二維的AABB包圍盒后,判斷該AABB包圍盒是否需要分裂成為兩個(gè)子AABB包圍 盒,若需要,則分裂該AABB包圍盒,以使后續(xù)產(chǎn)生的陰影圖反走樣效果質(zhì)量高。
3、 根據(jù)權(quán)利要求2所述的視野驅(qū)動(dòng)的實(shí)時(shí)陰影方法,其特征在于所述的需要分裂的過 程分為判斷是否需要分裂和進(jìn)行分裂的兩個(gè)過程;其中判斷過程為首先計(jì)算出陰影圖利用率v,在光源平面上為視野投影所得到的投影 區(qū)域求得其AABB包圍盒,分別求出投影區(qū)域的面積&和AABB包圍盒的面積Sr兩者的比 值Sp/Sr即為v,設(shè)定一個(gè)所需要的閾值n,當(dāng)v〈 q的時(shí)候,需要把二維AABB包圍盒分 裂成兩個(gè)子AABB包圍盒;進(jìn)行分裂的過程為求得投影區(qū)域的兩條對(duì)角線的交點(diǎn)C,選取C作為AABB包圍盒分 裂的基準(zhǔn)點(diǎn),從C點(diǎn)出發(fā)繪制兩條分別平行于AABB包圍盒的邊,并且該兩邊相互垂直,然 后從其中的一條直線出發(fā),把投影區(qū)域分成兩個(gè)多邊形,再分別對(duì)這兩個(gè)多邊形求出兩個(gè)子 AABB包圍盒,并求出兩個(gè)子AABB包圍盒的面積和S1,重復(fù)以上方法,對(duì)于另一條直線同 樣也可以得到兩個(gè)子AABB包圍盒及二者的面積和S2,比較S1和S2的大小,選取兩者中 的較小值所對(duì)應(yīng)的邊為最終的分裂邊。
4、 根據(jù)權(quán)利要求1或2所述的視野驅(qū)動(dòng)的實(shí)時(shí)陰影方法,其特征在于所述的步驟a 把視野反投影到光源平面產(chǎn)生投影區(qū)域的過程為(1) 從視點(diǎn)位置繪制出視野;(2) 利用下述計(jì)算公式將視野反投影到光源平面產(chǎn)生投影區(qū)域 <formula>formula see original document page 3</formula>(1)其中(x,乂z)為視野范圍中的某個(gè)任意片元戶的坐標(biāo),0'j')為視野范圍中的某個(gè)任意片元戶在光源平面上的投影尸怖坐標(biāo),^h^Mo必v/ew和附^eM^ few分別表示光源 坐標(biāo)系下的模型視點(diǎn)矩陣和視點(diǎn)坐標(biāo)系下的模型視點(diǎn)矩陣的逆陣。
全文摘要
一種視野驅(qū)動(dòng)的實(shí)時(shí)陰影方法,三維虛擬環(huán)境中包括以下步驟a)把視野反投影到光源平面產(chǎn)生投影區(qū)域,為該投影區(qū)域生成一個(gè)二維的AABB包圍盒;b)生成陰影圖,該陰影圖所覆蓋的范圍僅僅在該AABB包圍盒內(nèi);c)將該陰影圖映射到場(chǎng)景中生成陰影。本發(fā)明避免了場(chǎng)景中不必要的陰影繪制,提高了陰影圖的利用率,反走樣的效果很好,而且只需要繪制一到兩幅陰影圖,方法的實(shí)時(shí)性很強(qiáng),可以滿足一個(gè)上百萬面片的大規(guī)模場(chǎng)景中實(shí)時(shí)陰影繪制的需要。
文檔編號(hào)G06T15/50GK101393651SQ20081022621
公開日2009年3月25日 申請(qǐng)日期2008年11月7日 優(yōu)先權(quán)日2008年11月7日
發(fā)明者沈旭昆, 勛 胡, 越 齊 申請(qǐng)人:北京航空航天大學(xué)