當前位置: 華文問答 > 數位

為什麽非要基於視窗來建立OpenGL上下文?視窗和Opengl和作業系統和GPU之間的關系是啥?

2022-09-18數位

不是非要的。

只不過OpenGL是古老的東西, 一開始只為了渲染,而渲染總要有個畫布 吧,於是讓人直覺地和視窗聯系了起來。常見的教程也就保留了基於視窗建立的做法。

但是後來也出現了離屏渲染的做法;再後來FBO出現以後,其實也算是跟實際視窗解耦了一半;再往後還有API是不需要「畫布」的(Compute)。

從現代API視角來看,建立完context能用一堆API,但如果要繪制到螢幕的話需要手動建立swapchain(you don't pay for what you don't use?)。

OpenGL這種 老API是把這部份內容隱含進context的 無法擺脫(為了相容性,可能也因為懶得改)。當然具體實作可以「虛構」一個實際上不做事情的swapchain……

OpenGL本身是平台無關的,但事實上做不到真的無關,所以需要一個「loader」或者說中間層。

一個系統可能有不同裝置,有不同的OpenGL支持,於是要靠這個中間層去定位/選擇裝置,以及做一些基礎工作(比如前面提到的)。

常見的就是Windows下WGL,Linux下GLX或者EGL,iOS下EAGL。

WGL不但古老,還是被Windows所打壓的,所以最慘,繞不過一個HDC。HDC是GDI的概念,最常見的就是透過HWND拿,系統也會根據視窗來選擇繫結的裝置。

當然GDI是能用CreateCompatibleDC(NULL)來建立「和當前螢幕相容」的記憶體DC的,不過事實上雖然用這個DC能看到載入了顯卡的驅動,但CreateContext是不成功的。

GLX雖然也很古老,但不知是開源界願意接受新事物,還是x11的C/S設計,導致建立glcontext是要指定drawable的——這就使得你可以脫離視窗,用CreateGLXPixmap(或者pbuffer?)去建立這個畫布。

EGL是後來搭配OpenGL ES出現的,一開始還雄心勃勃想成為跨平台的介面,後來隨著轉向vulkan這事也偃旗息鼓了。

但EGL的確足夠開放,加了一堆擴充套件,不但能像GLX一樣用Pixmap/Pbuffer(好像後者更合適,至少安卓沒提供前者),後來因為被wayland選中,逐漸往底層擴充套件,甚至還能直接對接gbm了 [1]

參考

  1. ^ EGL_MESA_platform_gbm https://registry.khronos.org/EGL/extensions/MESA/EGL_MESA_platform_gbm.txt