本系列根據國外一個圖形小哥的講解為本,整合互聯網的一些資料,結合自己的一些理解。
什么是緩沖區?
緩沖區是保存某些數據的臨時存儲空間。
為什么我們需要緩沖區?原因很簡單,當數據量很大時,因為計算機無法同時處理整個數據,因此在處理當前數據集時需要額外的空間來存儲其余數據。
在計算機圖形學中,緩沖區有多種定義方式。
- 分辨率:寬度(n) x 高度(m)
- 深度(或精度):k
- 位數/像素
例如,如果我們想要每個像素使用 RGB 通道,則一個通道需要 8 位,總共 24 位(3 x 8 位)。
OpenGL 中的緩沖區
在openGL中,有顏色緩沖區、深度緩沖區、模板緩沖區等。
顏色緩沖區用于顯示:
- 前后
- 輔助(存儲處理中的圖像并對其應用一些操作)
- 立體顯影(用于頭戴式顯示器。它們為眼睛的每一側都有兩個獨立的顯示。)
深度緩沖區用于遮擋。它只保存 z 值,即灰度表示。
模板緩沖區類似于使用蒙版進行繪畫。你把一個有孔的模具放在紙上,然后你在紙上噴漆,結果將是一張與孔所在位置相對應的黑色紙張。模板緩沖區為繪制區域存儲 1 位值,為其他區域存儲 0 位值。
寫入緩沖區
從概念上講,我們可以將所有內存視為一個大型的二維像素數組。我們讀取和寫入矩形像素塊,幀緩沖區是該內存的一部分。
位寫入模式
source源和destination目標以按位方式組合,有 16 種可能。
緩沖區選擇
OpenGL 可以從任何緩沖區(前、后、深度)讀取。但要注意,幀緩沖區中像素的格式與處理器內存中的像素格式不同,而且這兩種類型的內存駐留在不同的地方————這會導致打包和拆包、讀取速度慢的問題。
我們使用“glReadPixels”函數讀取緩沖區。
例如,讀取圖像緩沖區將是:
緩沖區寫入的應用場景
混合與合成
將綠幕替換成自定義背景。
不透明度和透明度(alpha 混合)
不透明的表面不允許光線通過,透明表面允許所有光線通過。那么半透明呢?它將會通過“一些”光線。
我們可以將半透明度表示為“1-不透明度”或“1-alpha”。
寫入模型
我們使用 RGBA 顏色的分量來存儲不透明度。在渲染過程中,我們可以擴展我們的寫入模型以使用 RGBA 值。
混合方程
讓我們為每個 RGBA 分量定義源和目標的混合因子。
- source = [s_r, s_g, s_b, s_alpha]
- destination = [d_r, d_g, d_b, d_alpha]
以下是源顏色和目標顏色:
- source factor = [b_r, b_g, b_b, b_alpha]
- destination factor = [c_r, c_g, c_b, c_alpha]
混合為
c = source*source_factor target*destinaion_factor ,其中 c
將是新的目標因子。
渲染順序依賴
當我們渲染一個對象時,以正確的順序渲染非常重要。
因為多邊形是按照沿著管道傳遞的順序渲染的,所以我們需要首先從相機渲染進一步的多邊形以獲得正確的遮擋效果(稍后更接近的面)。
讓我們考慮一下一個物體同時具有不透明和半透明表面的情況。
- 不透明的面阻擋其后面的所有多邊形,它會影響深度緩沖區。
- 半透明面不應影響深度緩沖區。
為了正確渲染這個對象,我們需要首先對多邊形進行排序以消除順序依賴性。
組合圖像
我們有時候會在視頻中看到淡入淡出(crossfade)的效果,以使場景順利過渡到下一個場景。我們也可以在這里使用 alpha 混合! Crossfade的過程相當于線性插值。
當t為0.6時,
然而,在許多情況下,加法不足以混合圖像,在電影制作中,他們需要額外的技術:
- 前景和背景分開拍攝。
- 當他們拍攝前景時,他們會用 Choramkey 背景來拍攝。
我們如何以數字方式做到這一點?
二值圖像掩模
與模板緩沖區一樣,使用掩模,我們可以將前景與背景分開。
但是我們可以在這里能看到一些鋸齒。
解決此問題的一種方法是根據前景和背景之間的邊界插入顏色。
對于邊界上的每個像素,我們可以確定前景與背景的面積比。
另一種方法稱為“alpha合成”,它存儲覆蓋的像素部分(稱為 alpha)。
另一個混合的例子
霧效果
我們也可以使用混合功能來模擬霧效果!
- C`:新的目標因子
- f : 霧因子
- Cs :源顏色
- (1-f):目標因子
- Cf : 霧顏色
混合等式:C` = f * Cs + (1-f) Cf