日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

OpenGL纹理转换谜团:纹理写入FRAMEBUFFER后的镜像现象

發布時間:2024/1/3 windows 44 coder
生活随笔 收集整理的這篇文章主要介紹了 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)的紋理附件默認使用的是紋理坐標系,其原點約定在屏幕的左下角;而在紋理坐標系約定中,如在進行圖像處理、計算機視覺等,我們通常使用的是以左上角為原點的紋理坐標系約定

三、解決方案

當我們將紋理綁定到幀緩沖區對象的顏色附件中后,如果輸出的紋理坐標與輸入的紋理坐標系一直(即原點一直位于左上角),那么最終得到的紋理將會是輸入紋理的鏡像紋理。

為了解決這個問題,我們可以采取以下兩種方法:

  1. 從幀緩沖區讀取紋理數據后:調整輸出紋理矩形的頂點坐標或紋理坐標的值,使其坐標系與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
            };
}

  1. 在綁定紋理到幀緩沖區之前,通過設置紋理的紋理坐標變換矩陣來翻轉紋理坐標系。將原點從左上角變為左下角,與默認的紋理坐標系約定一致。
    (該方法需要在Shader中進行變化,有些復雜,可參考第一種方式,這里不詳細說明)

三、源碼下載

ExternalOES紋理數據 轉換為 TEXTURE-2D紋理數據:
https://download.csdn.net/download/aiwusheng/88650498

參考

解密視頻魔法:ExternalOES轉化TEXTURE_2D紋理:
https://editor.csdn.net/md/?articleId=135137815

總結

以上是生活随笔為你收集整理的OpenGL纹理转换谜团:纹理写入FRAMEBUFFER后的镜像现象的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。