OpenGL纹理转换谜团:纹理写入FRAMEBUFFER后的镜像现象
生活随笔
收集整理的這篇文章主要介紹了
OpenGL纹理转换谜团:纹理写入FRAMEBUFFER后的镜像现象
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在OpenGL中,最近將一個 GL_TEXTURE_2D 紋理寫入到 GL_FRAMEBUFFER ,然后從GL_FRAMEBUFFER讀取為GL_TEXTURE_2D紋理后,發現GL_TEXTURE_2D紋理變為了輸入紋理的鏡像紋理。效果圖如下圖所示。
本文將探討這個問題的原因,并提出兩種解決方案。
一、紋理寫入幀緩沖
- 在
OpenGL中,我們通常使用以下API將紋理ID綁定到FRAMEBUFFER的顏色緩沖區。
GLES30.glBindFramebuffer(GLES30.GL_FRAMEBUFFER, frameBufferId);
GLES30.glFramebufferTexture2D(GLES30.GL_FRAMEBUFFER, GLES30.GL_COLOR_ATTACHMENT0, GLES30.GL_TEXTURE_2D, tex2DId, 0);
- 將
GL_TEXTURE_2D紋理渲染到FRAMEBUFFER幀緩沖區中;
// 激活紋理
GLES30.glActiveTexture(GLES30.GL_TEXTURE0);
// 將所需的紋理對象綁定到Shader中紋理單元0上
GLES30.glUniform1i(mTextureIdHandle, 0);
// 綁定紋理
GLES30.glBindTexture(GLES30.GL_TEXTURE_2D, texId);
// 綁定FRAMEBUFFER緩沖區
GLES30.glBindFramebuffer(GLES30.GL_FRAMEBUFFER, frameBufferId);
// 繪制矩形
GLES30.glDrawArrays(GLES30.GL_TRIANGLE_STRIP, 0, mVertexCount);
// 取消FRAMEBUFFER的綁定
GLES30.glBindFramebuffer(GLES30.GL_FRAMEBUFFER, GLES30.GL_NONE);
- 最后,繪制
渲染GL_TEXTURE_2D紋理,從FrameBuffer中讀取紋理數據。
// 激活紋理
GLES30.glActiveTexture(GLES30.GL_TEXTURE0);
GLES30.glUniform1i(mTex2DIdHandle, 0);
// 綁定紋理
GLES30.glBindTexture(GLES30.GL_TEXTURE_2D, tex2DId);
// 繪制矩形
GLES30.glDrawArrays(GLES30.GL_TRIANGLE_STRIP, 0, mVertexCount);
二、問題原因
在OpenGL中,幀緩沖區對象(FBO:Framebuffer Object)的紋理附件默認使用的是紋理坐標系,其原點約定在屏幕的左下角;而在紋理坐標系約定中,如在進行圖像處理、計算機視覺等,我們通常使用的是以左上角為原點的紋理坐標系約定。
三、解決方案
當我們將紋理綁定到幀緩沖區對象的顏色附件中后,如果輸出的紋理坐標與輸入的紋理坐標系一直(即原點一直位于左上角),那么最終得到的紋理將會是輸入紋理的鏡像紋理。
為了解決這個問題,我們可以采取以下兩種方法:
-
從幀緩沖區讀取紋理數據后:調整輸出紋理矩形的頂點坐標或紋理坐標的值,使其坐標系與FOB的坐標系相匹配,從而達到正常展示的目的。
以下舉例中為按幀緩沖區坐標系,調整紋理坐標后的頂點與紋理對應關系:
// 按幀緩沖區坐標系,調整紋理坐標后的頂點與紋理對應關系:
// 頂點個數
mVertexCount = 4;
// 頂點坐標
float vertices[] =
{
-1.0f, 1.0f, 0.0f,
-1.0f, -1.0f, 0.0f,
1.0f, 1.0f, 0.0f,
1.0f, -1.0f, 0.0f
};
// 紋理坐標
float texCoor[] =new float[]
{
0.0f, 1.0f,
0.0f, 0.0f,
1.0f, 1.0f,
1.0f, 0.0f
};
}
-
在綁定紋理到幀緩沖區之前,通過設置紋理的紋理坐標變換矩陣來翻轉紋理坐標系。將原點從左上角變為左下角,與默認的紋理坐標系約定一致。
(該方法需要在Shader中進行變化,有些復雜,可參考第一種方式,這里不詳細說明)
三、源碼下載
ExternalOES紋理數據 轉換為 TEXTURE-2D紋理數據:
https://download.csdn.net/download/aiwusheng/88650498
參考
解密視頻魔法:ExternalOES轉化TEXTURE_2D紋理:
https://editor.csdn.net/md/?articleId=135137815
總結
以上是生活随笔為你收集整理的OpenGL纹理转换谜团:纹理写入FRAMEBUFFER后的镜像现象的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 家用路由器怎样设置 用家用路由器如何蹭网
- 下一篇: 前端 Git 使用约定