在剛開始接觸著色器語言時,我就考慮過這樣的問題:
(1)場景中如果有多個光源,它們對物體顏色的貢獻應該以怎樣的方式疊加在一起?實際上,(1)的答案本身應該非常簡單,那就是直接將所有光源的貢獻(算上當前位置的衰減)直接相加。但是,考慮到問題(2),哪怕光非常昏暗,只要燈光數量足夠多,就總會出現總和超過1的現象,使得畫面效果失真,而在現實世界中,卻好像並沒有見過這樣的情況——哪怕光線非常強烈,人眼也不至於完全看不見場景細節,也就是說,人眼具有在較強和較暗光照下看清物體細節的能力。(2)如果所有光源貢獻的總和超過了1,顏色強弱細節將會丟失,呈現單一的白色。應用程式有沒有辦法避免這種現象?
之後,接觸到了乙個叫hdr的東西。hdr這個詞好像在很多地方都被廣泛提及,但它們具體指代的東西,卻不盡相同。hdr的全稱是high dynamic range(高動態範圍)。而我們所稱的「hdr",更準確而言只是一種色調對映的影象演算法,是軟體級別的東西,將顏色對映到乙個更加合理的區間範圍,來保留更多的顏色細節。
此處,我使用了中給出的色調對映公式:
color = vec3(1.0) - exp(-color * hdrexp);
其中,引數hdrexp控制了**度,它的值越大,**就越強。
在hdrexp = 1時,它的函式影象大致如上,可看出顏色較暗時變化接近線性變化,隨著顏色變亮,對映後的顏色增速逐漸變緩。
隨著hdrexp的增加,對映後的顏色會更加偏亮。
如在下圖中,我將多個點光源移動到了圖中心部分最亮的那個位置,此時由於光源過多,它們的顏色貢獻總和超過了1,中心呈現比較刺眼的白色。
此時,我們在其它引數都保持不變的情況下,開啟「hdr」,可在下圖看到,刺眼的「白色」消失了,我們看到了多個點光源照亮同一區域地板的顏色細節,並依然能感受到,該區域依然比別的區域更亮:
**度變化的比較:
上面四張圖,從左到右,從上到下,**度分別為0.3,0.65,1.36,3.6。
啊,本來還做了gamma矯正,但是目前我的點光源依然是用比較古老的光照方程來做的,使用gamma矯正完全沒有什麼好的效果,等哪天做好了pbr demo再來測試一下效果吧~
顯示效果測試
include cstdio include cstring include algorithm using std sort define maxn 50010 struct ccartesian cartesian maxn struct cdata data maxn intorder max...
繫結變數效果測試
今天看了一些書關於繫結變數所以做了如下測試 資源表t ac01內容100000左右 然後建立測試表test create table tset as select from t ac01 where rownum 1 建立測試過程1使用繫結變數 create or replace procedure...
測試JavaScript的學習效果
convert celsius to fahrenheit 做乙個攝氏度轉華氏度的小應用。從celsius攝氏度轉換為fahrenheit華氏度的演算法是 攝氏度的溫度乘於9除於5,再加上32。建立乙個變數 fahrenheit,然後計算出攝氏度對應的華氏度。function convert cel...