androidopengl紋理
1. 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 上。
參考資料:
2. android opengl es給多個矩形上紋理
誒呀,你這種用法大錯特錯了呀!
texImage2D 不能亂用呀 , 他是把資源導入GL用的,有點像玩游戲時的Loading.你應該在你的程序初始化時
先glGentexture 生成多個紋理句柄...然後BindTexture ,再把你需要的圖片依次輸入...這時GL已經擁有了你全部的圖片資源 ,然後在繪制的時候,
用到哪張紋理 就先Bind 這個紋理,然後DrawArray ,再Bind 再DrawArray/DrawElement..
哪有你這樣每次draw 都要texImage2D 的? 這不要慢死了...
推薦你去power vr的網站下載Opengles的pc端 SDK ,裡面好多demo
3. Android音視頻(六) 使用OpenGL ES 3.0預覽Camera
剛學習了OpenGL的紋理相關知識,終於可以接著寫Android音視頻系列了。
本篇博客會介紹使用OpenGL ES 3.0相關知識預覽Camera,並且提供Camera和Camera2兩個版本實現。
頂點著色器
片段著色器
紋理的類型需要使用 samplerExternalOES ,而不是之前渲染圖片的 sampler2D。
我們知道Android相機輸出的原始數據一般都為YUV數據,而在OpenGL中使用的絕大部分紋理ID都是RGBA的格式,所以原始數據都是無法直接用OpenGL ES來渲染的。所以我們添加了一個擴展 #extension GL_OES_EGL_image_external_essl3 : require ,其中定義了一個紋理的擴展類型 GL_TEXTURE_EXTERNAL_OES 。後面綁定紋理時需要綁定到 GL_TEXTURE_EXTERNAL_OES 上,而不是類型GL_TEXTURE_2D上。
其實前面部分和載入圖片沒有什麼區別,最後兩行,對應上面流程中的1、2步。創建紋理,綁定外部紋理,然後根據紋理ID創建SurfaceTexture作為相機預覽輸出。
使用Camera2在OpenGL方面其實是一樣的,並沒有什麼改動。所以只需要看一下Camera2的調用就好。
源碼地址