(已恢復服務)Apple 部分 iCloud 雲端服務中斷,官方正在加緊修復中_網頁設計公司

綠能、環保無空污,成為 電動車最新代名詞,目前市場使用率逐漸普及化

台中景泰電動車行只是一個單純的理由,將來台灣的環境,出門可以自由放心的深呼吸,讓空氣回歸自然的乾淨,減少污染,留給我們下一代有好品質無空污的優質環境

有使用 iCloud 雲端服務的人,應該可以發現部分服務好像無法使用,這絕對不是你個人的問題,Apple 已經確認許多持續性的服務目前處於中斷狀態,且正在著手處理並已修復許多問題,在官方的努力下目前還無法使用的部分包含備份、郵件、Notes 與鑰匙圈等。

Apple 部分 iCloud 雲端服務中斷,官方正在加緊修復中

Apple 尚未就其故障的原因做出說明,也沒有表示有多少用戶會受到影響,從 Apple 官方的 System Status 網頁中僅寫著「Some users are affected」( 某些用戶受到影響)與「Users may be unable to use this service」(用戶可能無法使用此服務)。目前看來狀況已經趨於和緩,但在稍早時候情況更加嚴重,甚至連 APP Store、Apple Music ,甚至 iTunes 商店、Mac 的 APP Store 都受到影響。截至筆者發表這篇報導時,包含下面這些功能都還沒有修復完成:

  • 尋找我的手機
  • iCloud 備份
  • iCloud 書籤與標籤
  • iCloud 聯絡人
  • iCloud 空間
  • iCloud 鑰匙圈
  • iCloud 郵件
  • iCloud Notes
  • iWork for iCloud
  • 相簿

如果你想要更即時地查看目前的修復進度,可從 System Status 網頁持續追蹤。

這狀況似乎也給我們一個提醒,在現今時代我們越來越依賴線上服務,雖然在跨裝置存取與取用方便快速,但別忘了重要文件還是要在自己的本機上進行備份,以免將所有檔案的主控權全部交付在他人手上,一旦雲端服務系統出現問題,就可能造成你的檔案無法使用,嚴重的話還可能全部消失。

◎消息來源:The Verge、Slash Gear

自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

網站的第一印象網頁設計,決定了客戶是否繼續瀏覽的意願。台北網動廣告製作的RWD網頁設計,採用精簡與質感的CSS語法,提升企業的專業形象與簡約舒適的瀏覽體驗,讓瀏覽者第一眼就愛上它。

2/4 15:00 更新:
目前 iCloud 所有服務皆已修復完成恢復正常。

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

以設計的實用美學觀點,規劃出舒適、美觀的視覺畫面,有效提昇使用者的心理期待,營造出輕鬆、愉悅的網站瀏覽體驗。

Intel 以數據回應來勢洶洶的 M1 晶片,全方位角度還是大勝一籌

自從 Apple 推出 M1 晶片的 Mac 系列以來,每每可以在網路上看到各界說法的追捧,也讓 M1 這款自家研發晶片似乎鍍了一層金。以目前網路上可見的說法看來,M1 似乎很能打,而 Intel 官方也公布了系列數據,以整體表現來具體展示自第 11 代 Core 處理器在各方面的優勢。

Intel 以數據回應來勢洶洶的 M1 晶片,全方位角度還是大勝一籌

Apple 並不是初次轉換處理器架構,雖說網路輿論、影片對 M1 的高評價讓人蠢蠢欲動,但這回 Intel 所公布的系列數據,則讓消費者能夠更理性地依照個人需要進行深入評估,以挑選最適合自己實際使用需求的最佳筆電。在對變因進行嚴謹控制之下,以均搭載 LPDDR4X-4266 16GB 記憶體的 Intel Core i7-1185G7 筆電和 M1 版 MacBook Pro 13 進行實際測試,在 Chrome 網頁瀏覽器環境下執行 WebXPRT 3 時,在效能對比,在 Stock Option Pricing 項目可達到 0.99 倍,而進行 Photo Enchancement 項目則能達到 2.96 倍。在進行主流生產力套裝工具 Office 365 時,i7-1185G7 筆電 機型在 Calc and Data Sort Large Excel File V1 項目的處理效能可至 1.93 倍,執行 PowerPoint PDF Export 項目可達 2.34 倍, Calc and Data Sort Large Excel File V2 項目時最高還可達到 3.23 倍。

至於內容創作方面,在 Adobe 系列軟體中同樣存在不同程度的領先。在 Premiere Pro 匯出 4K 影片時,硬體加速 H.264 速度提高 1.42 倍,軟體 H.265 更一口氣提高到 1.72 倍。進行在 M1 上需經 Rosetta 2 轉譯的 Photoshop 與 Lightroom Classic Proto Merge Panorama 時,執行速度更分別來到 1.49 倍與1.57 倍。Handbrake 硬體加速 4K AVC 轉 HEVC 速度亦可達到 1.12 倍,可透過 AVX-512 VNNI 指令集加速的 Topaz Lab 系列軟體,速度更暴衝至 6 倍之多。

部份遊戲如《古墓奇兵:暗影》、《邊緣禁地 3》等,可透過 Rosetta2 轉譯於 Apple M1 上執行,效能表現與 Intel Iris Xe 顯卡互有高低,但更多遊戲則由於相容性問題而無法於 Apple M1 上運行。特別是許多知名 3A 大作更是如此,而 Intel Evo 平台還可因應實際需要搭配外接顯卡來進行 3D 圖形效能的強化,這點在 Apple M1 上更是目前所做不到的擴展,對於遊戲玩家來說,X86 處理器搭配 Windows 系統尤為首選。

M1 版 MacBook Air 聲稱透過 Apple TV 應用程式觀看 1080P 影片時的電池續航可達到 18 小時,瀏覽 25 款主流受歡迎網站則可達到 15 小時,但此番數據的測試條件中必須將螢幕從最低亮度向上提升 8 格,約 125nits 才能達成。Intel 以 M1 版 MacBook Air 與配備 Intel Core i7-1165G7 的 Acer Swift 5 兩款機型,在實際使用情境的平均螢幕亮度 250nits 的同樣條件下進行測試,前者在透過 Safari 瀏覽器觀賞 Netflix 影音與瀏覽多個網頁分頁,電池續航降至約 10 小時 12 分鐘,而後者的續航力約為 10 小時 6 分鐘,兩者不相上下。

隨著使用者的需求多元,Intel 處理器與 Windows 系統提供用戶更廣泛的相容性與高效能,近期 Intel 推出的新認證 Evo 更是為搭載最新第 11 代 Core 行動處理器的筆電制定了規範,提供 1 秒喚醒、長效續航、快速充電與高速 Thunderbolt 4、WiFi 6 連接等最新、最符合用戶期望的標準規格,無論你是商務、學習、玩家、內容創作者或是特殊需求用戶,都能在多樣化的產品線中找到最適合的筆電。

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

【其他文章推薦】

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※教你寫出一流的銷售文案?

※別再煩惱如何寫文案,掌握八大原則!

真糾結!到底要不要多加2萬預算買車

我去,這ES是老人家開的吧。一點激情都沒有嗯,這雷克薩斯GS就好多啦。都花到這個錢了,雷克薩斯也是二線豪車啊。買奔馳E級多好哇,這E級操控也不行啊,那麼長的車身。而且豪華感還是不夠啊,現在S大優

由於十分討厭公交車

小王準備買一電動車

於是他走進了電驢店

想想電驢只能跑幾十公里

又覺得買個摩托車比較好。

可是摩托車動輒6000到8000。都可以付麵包車的首付啦,好歹是個汽車。

想想麵包車,還不如咬咬牙買個轎車。

於是小王關注比亞迪F3。

再加兩萬能買到帝豪,那檔次就不一樣了

可是買帝豪我都可以買個哥瑞了。

哎呀媽呀,哥瑞低配連收音機都沒有,再加兩萬買凌派

咦,本田XRV這麼好看。還是SUV呢

可是這車看上去咋那麼小。CRV大那麼多,好像也貴不了多少,就買CRV吧。

哇,豐田漢蘭達那麼大,這才是真男人座駕。

買漢蘭達的錢可以買個皇冠,皇冠多霸氣呀,說皇冠誰都知道。

皇冠也是豐田,還不如買個雷克薩斯ES。

我去,這ES是老人家開的吧?一點激情都沒有

嗯,這雷克薩斯GS就好多啦。

都花到這個錢了,雷克薩斯也是二線豪車啊!買奔馳E級多好

哇,這E級操控也不行啊,那麼長的車身。而且豪華感還是不夠啊,現在S大優本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※教你寫出一流的銷售文案?

※別再煩惱如何寫文案,掌握八大原則!

Facebook 也要進軍智慧型手錶市場,首款產品預計明年推出

智慧型手錶現在雖然已經是一遍紅海,但這對持續想擴張版圖的 Facebook 來說,似乎沒在擔心的。最近就有外媒指出,Facebook 下一個新硬體設備將會是智慧型手錶,主要會著重在與 Facebook 服務的整合和運動相關功能,預計明年就有可能登場。

Facebook 也要進軍智慧型手錶市場

根據外媒 The Information 最新報告,內部人士透露,Facebook 現在正在製造一款智慧型手錶,且希望明年就開始銷售。雖然詳細硬體、外型、與售價都還不清楚,但可以確定的是,這款 Facebook 智慧型手錶將會讓用戶更容易使用 Facebook 服務,像是透過 Messenger 發送訊息之類,也預計會加入行動網路的支援性,代表說無需連接手機即可使用各項功能。

此外,報告中也提到這款手錶會著重在健康、運動鍛鍊領域,像是你可以追蹤朋友的鍛鍊紀錄、跟教練溝通、使用 Peloton 等健康和健身公司的 App 服務等等,沒意外作業系統將會是 Android(Wear OS)。

從以上內容其實也能推測出,Facebook 未來搞不好會推出運動健身的訂閱服務,就像 Apple Fitness+ 一樣。價格方面 Facebook 似乎也打算以生產成本的價格進行販售,也就是不靠這個賺錢,所以真的是蠻有可能的。

Apple Fitness+ 健身訂閱服務(圖片來源):

話說回來,Facebook 選這時間點進入市場其實也蠻聰明的,現在大家已經非常習慣靠智慧型手錶、智慧型手環來紀錄運動鍛鍊,再加上連 Apple 都跳進這領域,代表市場已經很成熟,而 Facebook 藉由整合自身強大的社群優勢,確實有機會快速搶下一定的市佔率。

無論如何,離明年還有一年左右的時間,計畫依舊有可能變動,不過內部人士是有提到這目標是長期的,甚至第二代也規劃好,預計 2023 年上市。

資料來源:The Information

iPhone 口罩解鎖現在就能玩!啟用 Apple Watch 口罩解鎖教學(戴全罩安全帽也 OK!)

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

【其他文章推薦】

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※教你寫出一流的銷售文案?

※別再煩惱如何寫文案,掌握八大原則!

10.99萬起 神車朗逸 軒逸都忌憚的車型哪款車型最值得買?

精英型和豪華型相差10000元了,不多倒是也多出了這麼多的配置,像無鑰匙啟動、真皮坐椅、中控屏幕、氙氣大燈、自動空調等這些配置,就算自己後期去加裝也要花不少錢,況且這些配置最好還是原車帶的比較靠譜,自己加裝的東西出問題又不在質保範圍內。

朗逸的銷量雖好,但是身後也有無數強敵,其中英朗算是一個強有力的競爭對手。英朗在10月份的銷量為34629輛,1-10月份累加銷量為303116輛,這數據真的是亮瞎眼。

英朗的指導價為10.99-15.99萬,車身尺寸為4587*1798*1463mm,軸距為2640mm,英朗的車長沒有達到4600mm以上算是一個遺憾,因為同級別的車子長度都超過了4600mm,不過好在英朗的外觀設計比較大氣,同時軸距不小,所以後排空間還是比較充裕的。

英朗的中控內飾用料以硬塑料為主,這也是這個級別通常的配置,不過英朗的內飾看起來設計感十足,層次感突出,體現出了別克內飾設計的“環繞的感覺”,看起來稍顯高檔。

英朗的動力系統為1.5L 114馬力+5擋手動/6擋手自一體、1.4T 144馬力+7擋雙離合,目前英朗有九款在售車型,消費者面對這麼多的車型,肯定是有點迷茫的,所以今天小編就給大家看一下英朗的哪款車性價比最高,爭取在買車的時候買到最實惠的從車型。

1.5L車型的手動擋和自動的差價在1萬元,也就是1萬元買了一台6AT變速箱。進取型、精英型、豪華型的其它配置是一樣。

低配和次低配差價8000元,主要多了前排側氣囊、天窗、雷達等,對於那些經常吸煙或者買車必須要天窗的消費者來說,精英版還是合適的。但是對於不要求配置的消費者來說,進取型就足夠了。

精英型和豪華型相差10000元了,不多倒是也多出了這麼多的配置,像無鑰匙啟動、真皮坐椅、中控屏幕、氙氣大燈、自動空調等這些配置,就算自己後期去加裝也要花不少錢,況且這些配置最好還是原車帶的比較靠譜,自己加裝的東西出問題又不在質保範圍內。

所以豪華版是為那些比較看重配置消費者準備的。

說完了1.5L車型,接下來該說一說1.4T車型,1.4T車型有三個型號,分別是精英型、豪華型、旗艦型。其中精英型和1.5L的精英型配置相同。

所以頂配車型更多的只是為了提高自身形象,性價比較低。倒是精英和豪華型具有一定的性價比。

總結:其實我們是不怎麼建議消費者選擇雙離合車型,因為變速箱的調教還不是很完美,0-100km/h加速大約為10.2s,成績也不是很理想。所以最好的選擇就是1.5L車型,如果資金不充足進取型就可以,在乎天窗了就精英型,對配置有要求了可以選擇豪華型。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※教你寫出一流的銷售文案?

※別再煩惱如何寫文案,掌握八大原則!

想買8-20萬的車必看!國內八大合資品牌的最大特點是什麼?

這就是豐田,一個力求把車方方面面都做的十分均衡的傢伙,尤其是在耐用性上,豐田車在耐用性上的口碑也一直是非常的好。現在的大街上我們能讓能夠看到一些非常老的豐田車型在繼續服役,而在二手車市場豐田的車型也十分的保值,這也能夠說明出它耐用性十分好的特點。

我們經常聽到別人說大眾車底盤穩,別克安靜日產舒適這樣的話,可是對於普通的消費者來說,很難有機會真正去試駕到這麼多品牌的許多車型的,因此對於許多消費者來說這些品牌的印象到底是真是假也沒有辦法驗證。作為一名汽車編輯,小編經常會有機會試駕到,各種各類的車型。因此對於不同品牌的基本調性也是有一定的了解和感受。那麼小編就總結八個比較熱門的合資品牌進行一個品牌特性的點評。

大眾

精緻/底盤好/懸挂設定優秀

大眾在中國可以算是一個金字招牌。是普通品牌裡頭非常成功的一個。那麼說到大眾我們最先想到的是套娃,無論是外觀和內飾大眾車型似乎都差不多。套娃給大眾帶來的好處就是它在內飾和外觀上都比較統一,除了像捷達pOLO車型的低配車型這類十分廉價的車型以外大眾車都是比較有精緻感的,而大眾車型全系的底盤以及懸挂的設定都比較優秀,讓人開起來十分的有信心,舒適性也不錯。

代表車型:大眾朗逸

別克

安靜/底盤好

說到底盤沉穩紮實就不得不提到另一個品牌,那就是別克。如果你在爛路上開一開別克車的話就會覺得別克的車型在底盤質感以及靜謐性上相比較其它車型有着不小的優勢。在整車的隔音車內的靜謐性上別克的車型也普遍比同價位的車型要更加的安靜。這也是許多中年大叔喜歡別克的原因所在。

代表車型:別克英朗

日產

舒適省油/動力弱

說到日產我們就會想到號稱大沙發的天籟以及日產引以為傲的CVT變速器。正是由於這個CVT變速器的幫助也給日產多數的車型留下了一個省油的印象。相比較同級別的車型日產的車確實是要更加省油的。也是由於CVT以及發動機的輸出比較弱的原因。日產的車型在主觀加速感受上或多或少都會感覺有些疲軟。

代表車型:日產軒逸

本田

動力強勁/樂趣好

最近幾年本田的發動機做的越來越牛逼了,就連冠道這麼大的車使用了本田的2.0T發動機都能夠達到七秒多的百公里加速。而思域飛度這些都是百公里加速輕鬆進十秒內的車型,加上十分線性的動力輸出以及靈活的車身,本田車的動力十分強勁駕駛樂趣也非常的好。

代表車型:飛度

豐田

耐用/均衡

說到豐田我們可能想不起它到底有什麼樣的特點,但是方方面面就讓你找不出明顯的缺點來。這就是豐田,一個力求把車方方面面都做的十分均衡的傢伙,尤其是在耐用性上,豐田車在耐用性上的口碑也一直是非常的好。現在的大街上我們能讓能夠看到一些非常老的豐田車型在繼續服役,而在二手車市場豐田的車型也十分的保值,這也能夠說明出它耐用性十分好的特點。

代表車型:卡羅拉

雪鐵龍

操控好/舒適性優秀

如果說日產的舒適性好更多的是靠座椅。那麼雪鐵龍的舒適性則是完完全全依靠着優秀的底盤和懸挂。雪鐵龍旗下車型在舒適性的表現上都是分的優秀。法系車在操控上一直都是有口皆碑。而雪鐵龍可以說是法系車的代表。

代表車型:世嘉

現代

配置高/好開

現在車在底盤以及發動機兩個方面表現都不咋地。行駛的質感和一線合資產品相比有一些差距。而操控性則是現代最不拿手的地方。因此現代十分雞賊的把旗下的每款車型都做的十分好開,方向調的特別輕。而漂亮的外觀和內飾超高的配置也是現代留給我們的印象。

代表車型:朗動

馬自達

日系寶馬/外觀漂亮

馬自達和本田一樣也是十分注重技術的廠家。馬自達的動力系統以及底盤在日系車中都是十分優秀的駕駛風格非常偏向於歐系,馬自達有着日系寶馬的稱號。在外觀上馬自達一直以來也是十分吸引人的。在魂動設計理念下馬自達的車型十分的迷人。但是內飾設計以及空間是馬自達的短板。

代表車型:馬自達3昂克賽拉

福特

操控好/油耗高

福特車型普遍在操控上都比較的優秀,尤其是嘉年華福克斯以及蒙迪歐。都是在操控上有一些造詣的車型,而即便是下福睿斯這種主打家用以及舒適的車型在駕駛感受上也是比較不錯的。而同樣的油耗偏高也是車主普遍反應的一個問題。蒙迪歐、福克斯油耗都不算低。

代表車型:福克斯本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※教你寫出一流的銷售文案?

※別再煩惱如何寫文案,掌握八大原則!

NVIDIA 終於出招,RTX 3060 限制挖礦算力減半,並推出挖礦專用 GPU 系列

從去年到現在,雖然 NVIDIA 有不斷釋出會想辦法提升顯示卡產量的消息,但加密貨幣價格持續上漲,即便產能真的有增加,依舊滿足不了挖礦市場,進而影響真正想買的遊戲玩家。為此,隨著 RTX 3060 確定會在 2 月 25 日上市,NVIDIA 也終於正式出招,將透過驅動程式來限制 RTX 3060 的以太幣挖礦算力,並宣佈推出專為挖礦打造的 NVIDIA CMP HX GPU 系列,沒意外 RTX 3060 應該會好買很多。

RTX 3060 將限制挖礦算力減半,並推出挖礦專用 GPU 系列

稍早 NVIDIA 宣布,RTX 3060 的驅動程式如果檢測到使用者正在進行 ETH 以太幣挖礦行為的特定屬性時,就會把挖礦算力限制在 50% 左右,也就是直接減半。

至於減半之後會剩下多少算力,NVIDIA 就沒有特別提到,不過既然少這麼多,礦主當然就不會想買這張顯示卡,也因此可大幅提升遊戲玩家買到的可能性。

根據 tom’s Hardware 實測數據,RTX 3060 Ti 的以太幣挖礦算力大約在 60.7MH/s,換算挖礦效率後,是目前最好的一張顯卡,達到 0.524 MHps/w(點我閱讀以太幣各顯卡挖礦算力的詳細介紹文章):

有些人可能會問,那已經開賣的 RTX 30 系列顯卡會不會採取同樣作法?基本上應該不會,因為就算推出也沒用,礦工不要更新驅動程式就好,也可能會有法律上的問題。

當然,NVIDIA 不會就這麼放棄龐大的挖礦市場,他們也同步推出專為挖礦打造的 CMP HX GPU 系列,共有四款:「30HX、40HX、50HX 與 90HX」,跟一般顯卡不同在,這系列取消了影像輸出介面,並優化採礦算力與效率。

下圖是官方提供的以太幣挖礦算力數據,最好的 90HX 可達到 86 MH/s、50HX 為 65MH/s、40HX 為 36MH/s、30HX 則是 26MH/s:

30HX 與 40HX 預計 Q1 就會推出,50HX、90HX 則要等到 Q2,皆時也會交由合作夥伴進行生產,如:華碩、憾訊等等,價格部分就還不知道,但應該會比現行的顯示卡還要便宜。

資料來源:NVIDIA

國外網咖受疫情影響生意慘淡,開始轉型成加密貨幣挖礦中心

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

【其他文章推薦】

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※教你寫出一流的銷售文案?

※別再煩惱如何寫文案,掌握八大原則!

防熊出沒 日本神奈川縣抓到熊先教怕人再野放

摘錄自2020年11月10日中央社報導

日本今年(2020年)熊出沒事件頻傳,半年來上萬件,不過神奈川縣的熊出沒卻逆勢大減,原因之一是實施「學習野放」策略,讓熊學會「怕人」再放歸山林。

讀賣新聞報導,與日本全國熊出沒大增的情況相反,神奈川縣內的熊出沒件數今年大減,原因之一是日本多處橡實歉收,熊因為缺乏食物而往人居處覓食,但神奈川縣內主要的熊棲息地,今年橡實豐收。另一個理由就是神奈川縣推動的「學習野放」策略奏效。

從2006年起,神奈川縣內若是抓到熊,會讓熊聞辣椒味、聽鞭炮聲等,讓熊接觸討厭的氣味與聲音、懂得害怕人後進行野放,到去年為止,共野放了28頭熊。

生物多樣性
國際新聞
日本
神奈川縣
人熊衝突
野放
人與動物衝突事件簿

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※教你寫出一流的銷售文案?

※別再煩惱如何寫文案,掌握八大原則!

DirectX11 With Windows SDK–31 陰影映射

前言

陰影既暗示着光源相對於觀察者的位置關係,也從側面傳達了場景中各物體之間的相對位置。本章將起底最基礎的陰影映射算法,而像複雜如級聯陰影映射這樣的技術,也是在陰影映射的基礎上發展而來的。

學習目標:

  1. 掌握基本的陰影映射算法
  2. 熟悉投影紋理貼圖的工作原理
  3. 了解陰影圖走樣的問題並學習修正該問題的常用策略

DirectX11 With Windows SDK完整目錄

Github項目源碼

歡迎加入QQ群: 727623616 可以一起探討DX11,以及有什麼問題也可以在這裏彙報。

核心思想

陰影映射技術的核心思想其實不複雜。對於場景中的一點,如果該點能夠被攝像機觀察到,卻不能被光源定義的虛擬攝像機所觀察到,那麼場景中的這一點則可以被判定為光源所照射不到的陰影區域。

以下圖為例,眼睛觀察到地面上最左邊的一點,並且從光源處觀察也能看到該點。因此該點不會產生陰影。

再看下面的圖,眼睛可以觀察到地面上中間那一點,但是從光源處觀察不能看到該點。因此該點會產生陰影。

具體落實下來應該怎麼做呢?對於點光源來說,由於它的光是朝所有方向四射散開的,但為了方便,我們可以像攝像機那樣選取視錐體區域(使用一個觀察矩陣 + 透視投影矩陣來定義),然後經過正常的變換后就能計算出光源到區域內物體的深度值;而對於平行光(方向光)來說,我們可以採用正交投影的方式來選取一個長方體區域(使用一個觀察矩陣 + 正交投影矩陣定義)。和一般的渲染流程不同的是,我們只需要記錄深度值到深度緩衝區,而不需要將顏色繪製到後備緩衝區。

陰影貼圖

陰影貼圖技術也是一種變相的“渲染到紋理”技術。它以光源的視角來渲染場景深度信息,即在光源處有一個虛擬攝像機,它將觀察到的物體的深度信息保存到深度緩衝區中。這樣我們就可以知道那些離光源最近的像素片元信息,同時這些點自然是不在陰影範圍之中。

通常該技術需要用到一個深度/模板緩衝區、一個與之對應的視口、針對該深度/模板緩衝區的着色器資源視圖(SRV)和深度/模板視圖(DSV),而用於陰影貼圖的那個深度/模板緩衝區也被稱為陰影貼圖

光源的投影

在考慮點光源的投影和方向光的投影時可能會有些困難,但這兩個問題其實可以轉化成虛擬攝像機的透視投影和正交投影。

對於透視投影來說,其實我們也已經非常熟悉了。在這種做法下我們只考慮虛擬攝像機的視錐體區域(即儘管點光源是朝任意方向照射的,但我們只看點光源往該視錐體範圍內照射的區域),然後對物體慣例進行世界變換、以光源為視角的觀察變換、光源的透視投影變換,這樣物體就被變換到了以光源為視角的NDC空間。

而對於正交投影而言,我們也是一樣的做法。正交投影的視景體是一個軸對齊於觀察坐標系的長方體。儘管我們不好描述一個方向光的光源,但為了方便,我們把光源定義在視景體xOy切面中心所處的那條直線上。這樣我們就只需要給出視景體的寬度、高度、近平面、遠平面信息就可以構造出一個正交投影矩陣了。

我們可以看到,正交投影的投影線均平行於觀察空間的z軸。

正交投影矩陣在第四章變換已經講過,就不再贅述。

投影紋理坐標

投影紋理貼圖技術能夠將紋理投射到任意形狀的幾何體上,又因為其原理與投影機的工作方式比較相似,由此得名。例如下圖中,右邊的骷髏頭紋理被投射到左邊場景中的多個幾何體上。

投影紋理貼圖的關鍵在於為每個像素生成對應的投影紋理坐標,從視覺上給人一種紋理被投射到幾何體上的感覺。

下圖是光源觀察的視野,其中點p是待渲染的一點,而紋理坐標(u, v)則指定了應當被投射到3D點p上的紋素,並且坐標(u, v)與投影到屏幕上的NDC坐標有特定聯繫。我們可以將投影紋理坐標的生成過程分為如下步驟:

  1. 將3D空間中一點p投影到光源的投影窗口,並將其變換到NDC空間。
  2. 將投影坐標從NDC空間變換到紋理空間,以此將它們轉換為紋理坐標

而步驟2中的變換過程則取決於下面的坐標變換:

\[u=0.5x+0.5\\ v=-0.5y+0.5 \]

即從x, y∈[-1, 1]映射到u, v∈[0, 1]。(y軸和v軸是相反的)

這種線性變換可以用矩陣表示:

\[\mathbf{T}=\begin{bmatrix} 0.5 & 0 & 0 & 0 \\ 0 & -0.5 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0.5 & 0.5 & 0 & 1 \\ \end{bmatrix}\\ \begin{bmatrix} x & y & 0 & 1 \end{bmatrix}\mathbf{T}=\begin{bmatrix} u & v & 0 & 1 \end{bmatrix} \]

那麼物體上的一點p從局部坐標繫到最終的紋理坐標點t的變換過程為:

\[\mathbf{p}\mathbf{W_{Obj}}\mathbf{V_{Light}}\mathbf{P_{Light}}\mathbf{T}=\mathbf{t} \]

這裏補上了世界變換矩陣,是因為這一步容易在後面的代碼實踐中被漏掉。但此時的t還需要經過透視除法,才是我們最終需要的紋理坐標。

HLSL代碼

下面的HLSL代碼展示了頂點着色器計算投影紋理坐標的過程:

// 頂點着色器
VertexPosHWNormalTexShadowPosH VS(VertexPosNormalTex vIn)
{
    VertexPosHWNormalTexShadowPosH vOut;
    
    matrix viewProj = mul(g_View, g_Proj);
    vector posW = mul(float4(vIn.PosL, 1.0f), g_World);

    vOut.PosW = posW.xyz;
    
    // ...
    
    // 把頂點變換到光源的投影空間
    vOut.ShadowPosH = mul(posW, g_ShadowTransform);
    return vOut;
}

// 像素着色器
float4 PS(VertexPosHWNormalTexShadowPosH pIn) : SV_Target
{
    // 透視除法
    pIn.ShadowPosH.xyz /= pIn.ShadowPosH.w;
    
    // NDC空間中的深度值
    float depth = pIn.ShadowPosH.z;
    
    // 通過投影紋理坐標來對紋理採樣
    // 採樣出的r分量即為光源觀察該點時的深度值
    float4 c = g_ShadowMap.Sample(g_Sam, pIn.ShadowPosH.xy);
    
    // ...
}

視錐體之外的點

在渲染管線中,位於視錐體之外的幾何體是要被裁剪掉的。但是,在我們以光源設置的視角投影幾何體而為之生成投影紋理坐標時,並不需要執行裁剪操作——只需要簡單投影頂點即可。因此,位於視錐體之外的幾何體頂點會得到[0, 1]區間之外的投影紋理坐標。然後具體的採樣行為則需要依賴於我們設置的採樣器。

一般來說,我們並不希望對位於視錐體外的幾何體頂點進行貼圖,因為這並沒有任何意義。考慮到可視深度在NDC空間的最大值為1.0f,我們可以採用邊界深度值為1.0f的邊框尋址模式

另一種做法則是結合聚光燈的策略,使聚光燈照射範圍之外的部分不受光照,亦即不在陰影的計算範圍內。

透視除法與投影的其他問題

來到正交投影,因為我們依然是要計算出NDC坐標,對於NDC空間範圍外的點,我們依然可以採用上面的尋址模式策略,但聚光燈的策略就不適用了。

此外,正交投影無需進行透視除法,因為正交投影后的坐標w值總是1.0f。但保留透視除法可以讓我們的這套着色器可以同時工作在正交投影和透視投影上。如果沒有透視除法,則只能在正交投影中工作。

算法思路

  1. 從光源的視角將場景深度以“渲染到紋理”的形式繪製到名為陰影貼圖的深度緩衝區中
  2. 從玩家攝像機的視角渲染場景,計算出該點在光源視角下NDC坐標,其中z值為深度值,記為d(p)
  3. 上面算出的NDC坐標的xy分量變換為陰影貼圖的紋理坐標uv,然後進行深度值採樣,得到s(p)
  4. 當d(p) > s(p)時, 像素p位於陰影範圍之內;自然相反地,當d(p) <= s(p)時,像素p位於陰影範圍之外(至於為什麼還有<,後面會提到)

改進TextureRender

既然陰影貼圖和RTT有着許多相似的地方,那何不把它也放到TextureRender裏面共用呢?只要添加一個開關控制該RTT是否用作陰影貼圖即可。

class TextureRender
{
public:
    template<class T>
    using ComPtr = Microsoft::WRL::ComPtr<T>;

    TextureRender() = default;
    ~TextureRender() = default;
    // 不允許拷貝,允許移動
    TextureRender(const TextureRender&) = delete;
    TextureRender& operator=(const TextureRender&) = delete;
    TextureRender(TextureRender&&) = default;
    TextureRender& operator=(TextureRender&&) = default;


    HRESULT InitResource(ID3D11Device* device,
        int texWidth,
        int texHeight,
        bool shadowMap = false,
        bool generateMips = false);

    // 開始對當前紋理進行渲染
    // 陰影貼圖無需提供背景色
    void Begin(ID3D11DeviceContext* deviceContext, const FLOAT backgroundColor[4]);
    // 結束對當前紋理的渲染,還原狀態
    void End(ID3D11DeviceContext * deviceContext);
    // 獲取渲染好的紋理的着色器資源視圖
    // 陰影貼圖返回的是深度緩衝區
    // 引用數不增加,僅用於傳參
    ID3D11ShaderResourceView* GetOutputTexture();

    // 設置調試對象名
    void SetDebugObjectName(const std::string& name);

private:
    ComPtr<ID3D11ShaderResourceView>        m_pOutputTextureSRV;          // 輸出的紋理(或陰影貼圖)對應的着色器資源視圖
    ComPtr<ID3D11RenderTargetView>          m_pOutputTextureRTV;          // 輸出的紋理對應的渲染目標視圖
    ComPtr<ID3D11DepthStencilView>          m_pOutputTextureDSV;          // 輸出紋理所用的深度/模板視圖(或陰影貼圖)
    D3D11_VIEWPORT                          m_OutputViewPort = {};        // 輸出所用的視口

    ComPtr<ID3D11RenderTargetView>          m_pCacheRTV;                  // 臨時緩存的後備緩衝區
    ComPtr<ID3D11DepthStencilView>          m_pCacheDSV;                  // 臨時緩存的深度/模板緩衝區
    D3D11_VIEWPORT                          m_CacheViewPort = {};         // 臨時緩存的視口

    bool                                    m_GenerateMips = false;       // 是否生成mipmap鏈
    bool                                    m_ShadowMap = false;          // 是否為陰影貼圖

};

在作為RTT時,需要創建紋理與它的SRV和RTV、深度/模板緩衝區和它的DSV、視口

而作為陰影貼圖時,需要創建深度緩衝區與它的SRV和DSV、視口

下面的代碼只關注創建陰影貼圖的部分:

HRESULT TextureRender::InitResource(ID3D11Device* device, int texWidth, int texHeight, bool shadowMap, bool generateMips)
{
    // 防止重複初始化造成內存泄漏
    m_pOutputTextureSRV.Reset();
    m_pOutputTextureRTV.Reset();
    m_pOutputTextureDSV.Reset();
    m_pCacheRTV.Reset();
    m_pCacheDSV.Reset();

    m_ShadowMap = shadowMap;
    m_GenerateMips = false;
    HRESULT hr;
    
    // ...
    
    // ******************
    // 創建與紋理等寬高的深度/模板緩衝區或陰影貼圖,以及對應的視圖
    //
    CD3D11_TEXTURE2D_DESC texDesc((m_ShadowMap ? DXGI_FORMAT_R24G8_TYPELESS : DXGI_FORMAT_D24_UNORM_S8_UINT),
        texWidth, texHeight, 1, 1,
        D3D11_BIND_DEPTH_STENCIL | (m_ShadowMap ? D3D11_BIND_SHADER_RESOURCE : 0));

    ComPtr<ID3D11Texture2D> depthTex;
    hr = device->CreateTexture2D(&texDesc, nullptr, depthTex.GetAddressOf());
    if (FAILED(hr))
        return hr;

    CD3D11_DEPTH_STENCIL_VIEW_DESC dsvDesc(depthTex.Get(), D3D11_DSV_DIMENSION_TEXTURE2D, DXGI_FORMAT_D24_UNORM_S8_UINT);

    hr = device->CreateDepthStencilView(depthTex.Get(), &dsvDesc,
        m_pOutputTextureDSV.GetAddressOf());
    if (FAILED(hr))
        return hr;

    if (m_ShadowMap)
    {
        // 陰影貼圖的SRV
        CD3D11_SHADER_RESOURCE_VIEW_DESC srvDesc(depthTex.Get(), D3D11_SRV_DIMENSION_TEXTURE2D, DXGI_FORMAT_R24_UNORM_X8_TYPELESS);

        hr = device->CreateShaderResourceView(depthTex.Get(), &srvDesc,
            m_pOutputTextureSRV.GetAddressOf());
        if (FAILED(hr))
            return hr;
    }

    // ******************
    // 初始化視口
    //
    m_OutputViewPort.TopLeftX = 0.0f;
    m_OutputViewPort.TopLeftY = 0.0f;
    m_OutputViewPort.Width = static_cast<float>(texWidth);
    m_OutputViewPort.Height = static_cast<float>(texHeight);
    m_OutputViewPort.MinDepth = 0.0f;
    m_OutputViewPort.MaxDepth = 1.0f;

    return S_OK;
}

需要注意的是,在創建深度緩衝區時,如果還想為他創建SRV,就不能將DXGI格式定義成DXGI_FORMAT_D24_UNORM_S8_UINT這些帶D的類型,而應該是DXGI_FORMAT_R24G8_TYPELESS

然後在創建陰影貼圖的SRV時,則需要指定為DXGI_FORMAT_R24_UNORM_X8_TYPELESS

開始陰影貼圖的渲染前,不需要設置RTV,只需要綁定DSV。

void TextureRender::Begin(ID3D11DeviceContext* deviceContext, const FLOAT backgroundColor[4])
{
    // 緩存渲染目標和深度模板視圖
    deviceContext->OMGetRenderTargets(1, m_pCacheRTV.GetAddressOf(), m_pCacheDSV.GetAddressOf());
    // 緩存視口
    UINT num_Viewports = 1;
    deviceContext->RSGetViewports(&num_Viewports, &m_CacheViewPort);

    // 清空緩衝區
    // ... 
    deviceContext->ClearDepthStencilView(m_pOutputTextureDSV.Get(), D3D11_CLEAR_DEPTH | (m_ShadowMap ? 0 : D3D11_CLEAR_STENCIL), 1.0f, 0);
    
    // 設置渲染目標和深度模板視圖
    deviceContext->OMSetRenderTargets((m_ShadowMap ? 0 : 1), 
        (m_ShadowMap ? nullptr : m_pOutputTextureRTV.GetAddressOf()), 
        m_pOutputTextureDSV.Get());
    // 設置視口
    deviceContext->RSSetViewports(1, &m_OutputViewPort);
}

渲染完成后,和往常一樣還原即可。

偏移與走樣

陰影圖存儲的是距離光源最近的可視像素深度值,但是它的分辨率有限,導致每一個陰影圖紋素都要表示場景中的一片區域。因此,陰影圖只是以光源視角針對場景深度進行的離散採樣,這將會導致所謂的陰影粉刺等圖像走樣問題。如下圖所示(注意圖中地面上光影之間輪流交替的“階梯狀”條紋):

而下圖則簡單展示了為什麼會發生陰影粉刺這種現象。由於陰影圖的分辨率有限,所以每個陰影圖紋素要對應於長江中的一塊區域(而不是點對點的關係,一個坡面代表陰影圖中一個紋素的對應範圍)。從觀察點E查看場景中的兩個點p1與p2,它們分別對應於兩個不同的屏幕像素。但是,從光源的觀察角度來看,它們卻都有着相同的陰影圖紋素(即s(p1)=s(p2)=s,由於分辨率的原因)。當我們在執行陰影圖檢測時,會得到d(p1) > s 及 d(p2) <= s這兩個測試結果,這樣一來,p1將會被繪製為如同它在陰影中的顏色,p2將被渲染為好似它在陰影之外的顏色,從而導致陰影粉刺。

因此,我們可以通過偏移陰影圖中的深度值來防止出現錯誤的陰影效果。此時我們就可以保證d(p1) <= s 及 d(p2) <= s。但是尋找合適的深度偏移需要反覆嘗試。

偏移量過大會導致名為peter-panning(彼得·潘,即小飛俠,他曾在一次逃跑時弄丟了自己的影子)的失真效果,使得陰影看起來與物體相分離。

然而,並沒有哪一種固定的偏移量可以正確地運用於所有幾何體的陰影繪製。特別是下圖那種(從光源的角度來看)有着極大斜率的三角形,這時候就需要選取更大的偏移量。但是,如果試圖通過一個過大的深度偏移量來處理所有的斜邊,則又會造成peter-panning問題。

因此,我們繪製陰影的方式就是先以光源視角度量多邊形斜面的斜率,併為斜率較大的多邊形應用更大的偏移量。而圖形硬件內部對此有相關技術的支持,我們通過名為斜率縮放偏移的光柵化狀態屬性就能夠輕鬆實現。

typedef struct D3D11_RASTERIZER_DESC {
    // ...
    INT             DepthBias;
    FLOAT           DepthBiasClamp;
    FLOAT           SlopeScaledDepthBias;
    BOOL            DepthClipEnable;
    // ...
} D3D11_RASTERIZER_DESC;
  1. DepthBias:一個固定的應用偏移量。
  2. DepthBiasClamp:所允許的最大深度偏移量。以此來設置深度偏移量的上限。不難想象,及其陡峭的傾斜度會導致斜率縮放偏移量過大,從而造成peter-panning失真
  3. SlopeScaledDepthBias:根據多邊形的斜率來控制偏移程度的縮放因子。

注意,在將場景渲染至陰影貼圖時,便會應用該斜率縮放偏移量。這是由於我們希望以光源的視角基於多邊形的斜率而進行偏移操作,從而避免陰影失真。因此,我們就會對陰影圖中的數值進行偏移計算(即由硬件將像素的深度值與偏移值相加)。在本Demo中採用的具體數值如下:

// [出自MSDN]
// 如果當前的深度緩衝區採用UNORM格式並且綁定在輸出合併階段,或深度緩衝區還沒有被綁定
// 則偏移量的計算過程如下:
//
// Bias = (float)DepthBias * r + SlopeScaledDepthBias * MaxDepthSlope;
//
// 這裏的r是在深度緩衝區格式轉換為float32類型后,其深度值可取到大於0的最小可表示的值
// MaxDepthSlope則是像素在水平方向和豎直方向上的深度斜率的最大值
// [結束MSDN引用]
//
// 對於一個24位的深度緩衝區來說, r = 1 / 2^24
//
// 例如:DepthBias = 100000 ==> 實際的DepthBias = 100000/2^24 = .006
//
// 本Demo中的方向光始終與地面法線呈45度夾角,故取斜率為1.0f
// 以下數據極其依賴於實際場景,因此我們需要對特定場景反覆嘗試才能找到最合適
rsDesc.DepthBias = 100000;
rsDesc.DepthBiasClamp = 0.0f;
rsDesc.SlopeScaledDepthBias = 1.0f

注意:深度偏移發生在光柵化期間(裁剪之後),因此不會對幾何體裁剪造成影響。

RenderStates中我們添加了這樣一個光柵化狀態:

// 深度偏移模式
rasterizerDesc.FillMode = D3D11_FILL_SOLID;
rasterizerDesc.CullMode = D3D11_CULL_BACK;
rasterizerDesc.FrontCounterClockwise = false;
rasterizerDesc.DepthClipEnable = true;
rasterizerDesc.DepthBias = 100000;
rasterizerDesc.DepthBiasClamp = 0.0f;
rasterizerDesc.SlopeScaledDepthBias = 1.0f;
HR(device->CreateRasterizerState(&rasterizerDesc, RSDepth.GetAddressOf()));

MSDN文檔Depth Bias講述了該技術相關的全部規則,並且介紹了如何使用浮點深度緩衝區進行工作。

百分比漸近過濾(PCF)

在使用投影紋理坐標(u, v)對陰影圖進行採樣時,往往不會命中陰影圖中紋素的準確位置,而是通常位於陰影圖中的4個紋素之間。然而,我們不應該對深度值採用雙線性插值法,因為4個紋素之間的深度值不一定滿足線性過渡,插值出來的深度值跟實際的深度值有偏差,這樣可能會導致把像素錯誤標入陰影中這樣的錯誤結果(因此我們也不能為陰影圖生成mipmap)。

出於這樣的原因,我們應該對採樣的結果進行插值,而不是對深度值進行插值。這種做法稱為——百分比漸近過濾。即我們以點過濾(MIN_MAG_MIP_POINT)的方式在坐標(u, v)、(u+△x, v)、(u, v+△x)、(u+△x, v+△x)處對紋理進行採樣,其中△x=1/SHADOW_MAP_SIZE(除以的是引用貼圖的寬高)。由於是點採樣,這4個採樣點分別命中的是圍繞坐標(u, v)最近的4個陰影圖紋素s0、s1、s2、s3,如下圖所示。

接下來,我們會對這些採集的深度值進行陰影圖檢測,並對測試的結果展開雙線性插值。

static const float SMAP_SIZE = 2048.0f;
static const float SMAP_DX = 1.0f / SMAP_SIZE;

// ...

//
// 採樣操作
//

// 對陰影圖進行採樣以獲取離光源最近的深度值
float s0 = g_ShadowMap.Sample(g_SamShadow, tex.xy).r;
float s1 = g_ShadowMap.Sample(g_SamShadow, tex.xy + float2(SMAP_DX, 0)).r;
float s2 = g_ShadowMap.Sample(g_SamShadow, tex.xy + float2(0, SMAP_DX)).r;
float s3 = g_ShadowMap.Sample(g_SamShadow, tex.xy + float2(SMAP_DX, SMAP_DX)).r;

// 該像素的深度值是否小於等於陰影圖中的深度值
float r0 = (depth <= s0);
float r1 = (depth <= s1);
float r2 = (depth <= s2);
float r3 = (depth <= s3);

//
// 雙線性插值操作
//

// 變換到紋素空間
float2 texelPos = SMAP_SIZE * tex.xy;

// 確定插值係數(frac()返回浮點數的小數部分)
float2 t = frac(texelPos);

// 對比較結果進行雙線性插值
return lerp(lerp(r0, r1, t.x), lerp(r2, r3, t.x), t.y);

若採用這種計算方法,則一個像素就可能局部處於陰影之中,而不是非0即1.例如,若有4個樣本,三個在陰影中,一個在陰影外,那麼該像素有75%處於陰影之中。這就讓陰影內外的像素之間有了更加平滑的過渡,而不是稜角分明。

但這種過濾方法產生的陰影看起來仍然非常生硬,且鋸齒失真問題的最終處理效果還是不能令人十分滿意。PCF的主要缺點是需要4個紋理樣本,而紋理採樣本身就是現代GPU代價較高的操作之一,因為存儲器的帶寬與延遲並沒有隨着GPU計算能力的劇增而得到相近程度的巨大改良。幸運的是,Direct3D 11+版本的圖形硬件對PCF技術已經有了內部支持,上面的一大堆代碼可以用SampleCmpLevelZero函數來替代。

float percentage = g_ShadowMap.SampleCmpLevelZero(g_SamShadow, shadowPosH.xy, depth).r;

方法中的LevelZero部分意味着它只能在最高的mipmap層級中進行採樣。另外,該方法使用的並非一般的採樣器對象,而是比較採樣器。這使得硬件能夠執行陰影圖的比較測試,並且需要在過濾採樣結果之前完成。對於PCF技術來說,我們需要使用的是D3D11_FILTER_COMPARISON_MIN_MAG_LINEAR_MIP_POINT過濾器,並將比較函數設置為LESS_EQUAL(由於對深度值進行了偏移,所以也要用到LESS比較函數)。

函數中傳入的depth將會出現在比較運算符的左邊,即:

depth <= sampleDepth

RenderStates中我們添加了這樣一個採樣器:

ComPtr<ID3D11SamplerState> RenderStates::SSShadow = nullptr;

// 採樣器狀態:深度比較與Border模式
ZeroMemory(&sampDesc, sizeof(sampDesc));
sampDesc.Filter = D3D11_FILTER_COMPARISON_MIN_MAG_LINEAR_MIP_POINT;
sampDesc.AddressU = D3D11_TEXTURE_ADDRESS_BORDER;
sampDesc.AddressV = D3D11_TEXTURE_ADDRESS_BORDER;
sampDesc.AddressW = D3D11_TEXTURE_ADDRESS_BORDER;
sampDesc.ComparisonFunc = D3D11_COMPARISON_LESS_EQUAL;
sampDesc.BorderColor[0] = { 1.0f };
sampDesc.MinLOD = 0;
sampDesc.MaxLOD = D3D11_FLOAT32_MAX;
HR(device->CreateSamplerState(&sampDesc, SSShadow.GetAddressOf()));

注意:根據SDK文檔所述,只有R32_FLOAT_X8X24_TYPELESSR32_FLOATR24_UNORM_X8_TYPELESSR16_UNORM格式才能用於比較過濾器。

在PCF的基礎上進行均值濾波

到目前為止,我們在本節中一直使用的是4-tap PCF核(輸入4個樣本來執行的PCF)。PCF核越大,陰影的邊緣輪廓也就越豐滿、越平滑,當然,花費在SampleCmpLevelZero函數上的開銷也就越大。在本Demo中,我們是按3×3正方形的均值濾波方式來執行PCF。由於每次調用SampleCmpLevelZero函數實際所執行的都是4-tap PCF,所以一共採樣了36次,其中有4×4個獨立採樣點。此外,採用過大的濾波核還會導致之前所述的陰影粉刺問題,但本章不打算講述,有興趣可以回到龍書閱讀(過大的PCF核)。

顯然,PCF技術一般來說只需在陰影的邊緣進行,因為陰影內外兩部分並不涉及混合操作(只有陰影邊緣才是漸變的)。基於此,只要能對陰影邊緣的PCF設計相應的處理方案就好了。但這種做法一般要求我們所用的PCF核足夠大(5×5及更大)時才划算(因為動態分支也有開銷)。不過最終是要效率還是要畫質還是取決於你自己。

注意:實際工程中所用的PCF核不一定是方形的過濾柵格。不少文獻也指出,隨機的拾取點也可以作為PCF核。

考慮到在做比較時,如果處於陰影外的值為1,在陰影內的值為0,在採用SampleCmpLevelZero和均值濾波后,我們用範圍值0~1來表示處於陰影外的程度。隨着值的增加,該點也變得越亮。我們可以使用下面的函數來計算3×3正方形的均值濾波下的陰影因子:

float CalcShadowFactor(SamplerComparisonState samShadow, Texture2D shadowMap, float4 shadowPosH)
{
	// 透視除法
    shadowPosH.xyz /= shadowPosH.w;
	
	// NDC空間的深度值
    float depth = shadowPosH.z;

	// 紋素在紋理坐標下的寬高
    const float dx = SMAP_DX;

    float percentLit = 0.0f;
    const float2 offsets[9] =
    {
        float2(-dx, -dx), float2(0.0f, -dx), float2(dx, -dx),
		float2(-dx, 0.0f), float2(0.0f, 0.0f), float2(dx, 0.0f),
		float2(-dx, +dx), float2(0.0f, +dx), float2(dx, +dx)
    };
                      
	[unroll]
    for (int i = 0; i < 9; ++i)
    {
        percentLit += shadowMap.SampleCmpLevelZero(samShadow,
			shadowPosH.xy + offsets[i], depth).r;
    }
    
    return percentLit /= 9.0f;
}

然後在我們的光照模型中,只有第一個方向光才參与到陰影的計算,並且陰影因子將與直接光照(漫反射和鏡面反射光)項相乘。

// ...
float shadow[5] = { 1.0f, 1.0f, 1.0f, 1.0f, 1.0f };
 
// 僅第一個方向光用於計算陰影
shadow[0] = CalcShadowFactor(g_SamShadow, g_ShadowMap, pIn.ShadowPosH);
    
[unroll]
for (i = 0; i < 5; ++i)
{
    ComputeDirectionalLight(g_Material, g_DirLight[i], pIn.NormalW, toEyeW, A, D, S);
    ambient += A;
    diffuse += shadow[i] * D;
    spec += shadow[i] * S;
}

// ...

由於環境光是間接光,所以陰影因子不受影響。並且,陰影因子也不會對來自環境映射的反射光構成影響。

C++端代碼實現

EffectHelper的引入

本章開始的代碼引入了EffectHelper來管理着色器所需的資源(我們可以無需手動創建並交給它來託管),並應用在了所有的Effect類當中。除了IEffect接口類,目前還引入了IEffectTransform接口類來統一變換的設置。隨着抽象類的增加,像GameObject這樣的類就可以對IEffect接口類對象查詢是否有某一特定接口類或具體類來執行額外的複雜操作。

此外,SkyRender類也因此有了輕微的變動。具體想了解還是去源碼翻閱,這裏不展開。

構建陰影貼圖與更新

首先我們要在GameApp::InitResource中創建一副2048×2048的陰影貼圖:

m_pShadowMap = std::make_unique<TextureRender>();
HR(m_pShadowMap->InitResource(m_pd3dDevice.Get(), 2048, 2048, true));

在本Demo中,光照方向每幀都在變動,我們希望讓投影立方體與光照所屬的變換軸對齊,並且中心能夠坐落在原點。因此在GameApp::UpdateScene可以這麼做:

//
// 投影區域為正方體,以原點為中心,以方向光為+Z朝向
//
XMMATRIX LightView = XMMatrixLookAtLH(dirVec * 20.0f * (-2.0f), g_XMZero, g_XMIdentityR1);
m_pShadowEffect->SetViewMatrix(LightView);

// 將NDC空間 [-1, +1]^2 變換到紋理坐標空間 [0, 1]^2
static XMMATRIX T(
    0.5f, 0.0f, 0.0f, 0.0f,
    0.0f, -0.5f, 0.0f, 0.0f,
    0.0f, 0.0f, 1.0f, 0.0f,
    0.5f, 0.5f, 0.0f, 1.0f);
// S = V * P * T
m_pBasicEffect->SetShadowTransformMatrix(LightView * XMMatrixOrthographicLH(40.0f, 40.0f, 20.0f, 60.0f) * T);

至於繪製部分,本Demo將和陰影有聯繫的場景對象放入了另一個重載函數DrawScene中(具體實現不在這給出),總體情況如下:

void GameApp::DrawScene()
{
    // ...

    // ******************
    // 繪製到陰影貼圖

    m_pShadowMap->Begin(m_pd3dImmediateContext.Get(), nullptr);
    {
        DrawScene(true);
    }
    m_pShadowMap->End(m_pd3dImmediateContext.Get());

    // ******************
    // 正常繪製場景
    m_pBasicEffect->SetTextureShadowMap(m_pShadowMap->GetOutputTexture());
    DrawScene(false, m_EnableNormalMap);

    // 繪製天空盒
    m_pDesert->Draw(m_pd3dImmediateContext.Get(), *m_pSkyEffect, *m_pCamera);

    // 解除深度緩衝區綁定
    m_pBasicEffect->SetTextureShadowMap(nullptr);
    m_pBasicEffect->Apply(m_pd3dImmediateContext.Get());

    // ...

}

演示

本Demo提供了5種斜率下的方向光,對應主鍵盤数字鍵1-5,Q鍵開關法線貼圖,E鍵開關陰影貼圖的显示,G鍵切換陰影貼圖的显示模式。

透明物體的陰影繪製

但我們的例程還沒有處理透明物體的陰影繪製。如果我們直接在場景中繪製一顆樹(貼圖存在Alpha值為0的部分),可以看到下圖的陰影並不正確:

因此,我們需要在繪製陰影貼圖的時候增加一個像素着色器用以進行Alpha裁剪,把Alpha值低於0.1的紋素給剔除掉,不要讓其寫入到陰影貼圖:

Texture2D g_DiffuseMap : register(t0);
SamplerState g_Sam : register(s0);

struct VertexPosHTex
{
    float4 PosH : SV_POSITION;
    float2 Tex : TEXCOORD;
};

// 這僅僅用於Alpha幾何裁剪,以保證陰影的显示正確。
// 對於不需要進行紋理採樣操作的幾何體可以直接將像素
// 着色器設為nullptr
void PS(VertexPosHTex pIn)
{
    float4 diffuse = g_DiffuseMap.Sample(g_Sam, pIn.Tex);
    
    // 不要將透明像素寫入深度貼圖
    clip(diffuse.a - 0.1f);
}

我們只在繪製樹的時候使用帶有像素着色器的版本,其餘物體照常繪製。並且因為我們的BasicEffect默認繪製就帶有Alpha裁剪,無需做這部分改動。最終效果如下:

練習題

  1. 嘗試4096×4096、1024×1024、512×512、256×256這幾種不同分辨率的陰影貼圖
  2. 嘗試以單次點採樣陰影檢測來修改本演示程序(即不採用PCF)。我們將欣賞到硬陰影與鋸齒狀的陰影邊緣
  3. 關閉斜率縮放偏移來觀察陰影粉刺
  4. 將斜率縮放偏移值放大10倍,觀察peter panning失真的效果
  5. 實現單點光源下的陰影(必要時可以考慮像CubeMap那樣使用6個正方形貼圖)
  6. 修改項目代碼,把繪製房屋改成繪製上圖中的樹(模型已給出),要求陰影显示正確

DirectX11 With Windows SDK完整目錄

Github項目源碼

歡迎加入QQ群: 727623616 可以一起探討DX11,以及有什麼問題也可以在這裏彙報。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

台北網頁設計公司這麼多該如何選擇?

※智慧手機時代的來臨,RWD網頁設計為架站首選

※評比南投搬家公司費用收費行情懶人包大公開

※回頭車貨運收費標準

網頁設計最專業,超強功能平台可客製化

※別再煩惱如何寫文案,掌握八大原則!

FAO:5月全球糧食供應鏈恐中斷 A股農業族群飆

摘錄自2020年3月31日聯合報報導

聯合國糧農組織(FAO)日前稱,受全球疫情影響,全球糧食供應鏈將於4月至5月中斷。而俄國、越南等國家為保證糧食供給,已宣布停止出口。A股農業族群今(31)日走強,金健米業再度飆漲停,京糧控股大漲8%,傲農生物、農發種業、萬向德農紛紛拉升。

金融網報導,其中,柬埔寨首相宣布受新冠肺炎疫情影響,將自4月5日起禁止部分大米出口。埃及自3月28日起未來3個月內停止各種豆類產品的出口;哈薩克斯坦禁止出口小麥麵粉、紅蘿蔔、糖和馬鈴薯;越南暫停簽署新的大米出口合約;俄國將每周評估情況,再決定是否實施出口禁令。

聯合國糧農組織(FAO)日前稱,受全球疫情影響,全球糧食供應鏈將於4月至5月中斷。而俄國、越南等國家為保證糧食供給,已宣布停止出口。

永續發展
土地利用
國際新聞
糧食

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※教你寫出一流的銷售文案?

※別再煩惱如何寫文案,掌握八大原則!