androidopengl的紋理
① 【Android 音視頻開發-OpenGL渲染視頻畫面篇】5.OpenGL FBO數據緩沖區
本文將引導你理解FBO(Frame Buffer Object)及其在OpenGL中的應用,特別是如何利用FBO實現離屏渲染和處理碎片畫面。我們將逐步介紹FBO的工作原理、創建流程以及在OpenGL渲染視頻畫面中的具體應用。
FBO與EGL離屏渲染的區別: FBO與EGL的離屏渲染在實現上存在差異。EGL用於創建離屏渲染緩沖區,主要用於模擬整個渲染窗口,如FFmpeg軟編碼場景。而FBO在OpenGL中提供了一種更為靈活的離屏渲染方式,不僅能實現整個OpenGL窗口的渲染,還能處理窗口內的碎片畫面。
FBO簡介: FBO是OpenGL中用於存儲渲染結果的對象,它包含顏色緩沖、深度緩沖和模板緩沖等。FBO實際上是一個緩存對象,用於管理多個緩沖索引,這些緩沖索引包含渲染結果。在OpenGL渲染到系統窗口之前,數據會被發送到FBO上,實現離屏渲染。
使用FBO渲染視頻畫面:
創建紋理:生成用於FBO的紋理,並進行紋理ID的綁定、紋理生成、設置邊緣參數,最後解綁。
新建FBO:類似紋理ID的創建過程,最後返回FBO索引。
綁定FBO:將創建的FBO與紋理通過顏色附著點綁定。
解綁FBO:將FBO綁定回默認的窗口。
實現「靈魂出竅」濾鏡: 通過FBO保存視頻的某一幀,實現動態效果的平滑過渡。使用封裝的FBO工具,如OpenGLTools,簡化FBO相關操作。在視頻渲染器中接入FBO,調整渲染流程,確保每一幀畫面的正確渲染。實現靈魂出竅效果的關鍵是保存並動態更新一幀畫面,通過時間控制刷新畫面,實現平滑放大與透明漸變。
總結: FBO在OpenGL中提供了強大的離屏渲染功能,適用於處理復雜視頻效果和碎片畫面。通過合理利用FBO,可以實現包括「靈魂出竅」在內的各種視覺效果。掌握FBO的使用,將有助於音視頻開發人員提升作品的視覺表現力。
② Android音視頻之使用OpenGL ES繪制圖片
關於 OpenGL ES 的介紹,請先看上篇: Android 音視頻之使用 OpenGL ES 繪制三角形 。
使用 OpenGL ES 繪制簡單的幾何形狀還不夠,OpenGL 更多地是用來顯示而紋理圖像,比如本地圖片、相機畫面。簡單說,紋理(texture)就是一個圖像或照片,它們可以被載入進 OpenGL 中。
OpenGL 中的紋理可以擾判用來表示圖像、照片等,每個二維的紋理都由許多小緩缺改的紋理元素組成,它們是小塊的數據,類似片段和像素。要使用紋理,最常用的方式是直接從一個圖像文件載入數據。
紋理不會被直接繪制,它們要被綁定到紋理單元,然後把這些紋理單元傳遞給著色器。紋理映射的基本思想就是:首先為圖元中的每個頂點指定恰當的紋理坐標,然後通過紋理坐標在紋理圖中可以確定選中的紋理區域,最後將選中紋理區域中的內容根據紋理坐標映射到指定的圖元上。
紋理的坐標系和頂點著色器的坐標系是不一樣的。紋理坐標用浮點數來表示,范圍 [0, 1],左上角坐標為 (0.0, 0.0),右上角坐標為 (1.0, 0.0)。注意:要將紋理坐標對應到正確的頂點上,才能使紋理正確扮銀地顯示。
定義頂點和紋理坐標,兩者的順序必須一一對應。
定義著色器。
載入圖片到 OpenGL 中。
計算變換矩陣,採用 CenterInside 或者 CenterCrop 的方式顯示。
顯示圖片。
源碼在 GitHub 上。
參考資料: