OpenGL——理解HDR與Bloom
阿新 • • 發佈:2019-01-08
學習資料連結
https://learnopengl-cn.github.io/05%20Advanced%20Lighting/06%20HDR/
https://learnopengl-cn.github.io/05%20Advanced%20Lighting/07%20Bloom/
HDR
一句話定義HDR:HDR是一個後期效果 一句話描述HDR:先渲染其他模型,並且過度曝光之,然後寫入幀緩衝,然後通過HDR Shader進行修正。當然,Unity裡面,後期是通過取出GPU中的資料,然後CPU裡面計算,在寫回GPU的方式,所以比較耗啦。 一句話說明HDR的目的:為了能夠正確的顯示那些亮度明顯應該超過1.0的顏色的細節。 [1.1]小結:何時需要Bloom
(1)準備一個FrameBuffer,繫結兩個ColorBuffer。在一個FragmentShader裡面,同時寫入兩個ColorBuffer。 一個寫入基礎片段資訊(Fragment ColorBuffer) 另一個只寫入高亮部分資訊(Bloom ColorBuffer),寫入高亮資訊時需要一個顏色過濾器。 (2)另外準備兩個FrameBuffer A(Horizontal)和B(Vertical),用作二次高斯運算。也就是先做水平高斯計算,在做垂直高斯計算,並且重複迭代這個過程,直到N次,N越大,模糊效果明顯。 第一次將BloomFrameBuff寫入FrameBufferA,這之後就在AB之前乒乓交換進行模糊值計算。 反覆N次。 最後將兩個FrameBuffer的片段的顏色值相加相加之後再通過Tone Mapping,將顏色值,根據一定的曝光度,對映到LDR顏色範圍內。HDR+Bloom的後期特效就完成了!
其他問題
//float brightness = dot(result, vec3(0.7152,0.2126, 0.0722));
float brightness = dot(result, vec3(0.333, 0.333, 0.333));
if(brightness > 1.0)
BrightColor = vec4(result, 1.0);
else
BrightColor = vec4(0.0, 0.0, 0.0, 1.0);
第一個傾向於讓紅色產生Bloom 第二個對於各種顏色的Bloom是均等的,但是要求亮度大於3才會產生Bloom 第二個問題是GaussBlur的Weight陣列
uniform float weight[5] = float[] (0.2270270270, 0.1945945946, 0.1216216216, 0.0540540541, 0.0162162162);
參考:
if(horizontal)
{
for(int i = 1; i < 5; ++i)
{
result += texture(image, TexCoords + vec2(tex_offset.x * i, 0.0)).rgb * weight[i];
result += texture(image, TexCoords - vec2(tex_offset.x * i, 0.0)).rgb * weight[i];
}
}......
為了顏色的亮度守恆,需要保證:[0] + 2[1]+2[2]+2[3]+2[4] = 1.0f