當前位置: 妍妍網 > 碼農

幾道常見的 OpenGL 面試題,很多人第一題就答不好

2024-05-10碼農

說說紋理常用的采樣方式?

最鄰近點采樣(GL_NEAREST)和雙線性采樣(GL_LINEAR)。

GL_NEAREST 采樣是 OpenGL 預設的紋理采樣方式 ,OpenGL 會選擇中心點最接近紋理座標的那個像素,紋理放大的時候會有鋸齒感或者顆粒感。

GL_LINEAR 采樣會基於紋理座標附近的紋理像素,計算出一個插值,近似出這些紋理像素之間的顏色。

一個紋理像素的中心距離紋理座標越近,那麽這個紋理像素的顏色對最終的樣本顏色的貢獻越大。因為與周圍的像素做加權平均了,紋理放大的時候會變模糊。

當進行放大(Magnify)和縮小(Minify)操作的時候可以設定紋理過濾的選項,比如你可以在紋理被縮小的時候使用鄰近過濾,被放大時使用線性過濾。

我們需要使用glTexParameter*函式為放大和縮小指定過濾方式。這段程式碼看起來會和紋理環繞方式的設定很相似:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

什麽是 EGL ?

EGL 是 OpenGL ES 和本地視窗系統(Native Window System)之間的通訊介面 ,它的主要作用:

  • 與裝置的原生視窗系統通訊;

  • 查詢繪圖表面的可用型別和配置;

  • 建立繪圖表面;

  • 在OpenGL ES 和其他圖形渲染API之間同步渲染;

  • 管理紋理貼圖等渲染資源。

  • OpenGL ES 的平台無關性正是借助 EGL 實作的,EGL 遮蔽了不同平台的差異

    本地視窗相關的 API 提供了存取本地視窗系統的介面,而 EGL 可以建立渲染表面 EGLSurface ,同時提供了圖形渲染上下文 EGLContext,用來進行狀態管理,接下來 OpenGL ES 就可以在這個渲染表面上繪制。

    紋理有哪些環繞方式(Wrapping)?

    環繞方式(Wrapping) 描述
    GL_REPEAT 對紋理的預設行為。重復紋理影像。
    GL_MIRRORED_REPEAT 和GL_REPEAT一樣,但每次重復圖片是映像放置的。
    GL_CLAMP_TO_EDGE 紋理座標會被約束在0到1之間,超出的部份會重復紋理座標的邊緣,產生一種邊緣被拉伸的效果。
    GL_CLAMP_TO_BORDER 超出的座標為使用者指定的邊緣顏色。

    當紋理座標超出預設範圍時,每個選項都有不同的視覺效果輸出。我們來看看這些紋理影像的例子:

    OpenGL ES 不支持 GL_CLAMP_TO_BORDER

    設定方式:

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT);

    鋸齒問題怎麽最佳化?

    主要有2種方式:

  • 高斯模糊(或者線性模糊)

  • 多重采樣

  • 高斯模糊(或者線性模糊)主要作用是在鋸齒的邊緣加一些過渡,讓邊緣看起來更平滑。

    多重采樣抗鋸齒是使用多個采樣點來決定一個片段的顏色,使邊緣的過渡更加平滑。

    多重采樣抗鋸齒實作主要是透過構建一個多重采樣渲染緩沖區(多重采樣紋理)作為顏色附著的幀緩沖區,詳細實作方式參考:

    -- END --

    進技術交流群, 掃碼添加我的微信:Byte-Flow

    獲取相關資料和源碼

    學習音視訊、OpenGL ES、Vulkan 、Metal、影像濾鏡、視訊特效及相關渲染技術的付費社群,面試指導,1v1 簡歷服務,職業規劃。

    我的付費社群

    推薦: