Emscripten對OpenGL的支持

Emscripten對OpenGL的支持

翻譯:雲荒杯傾
本文是Emscripten-WebAssembly專欄系列文章之一,更多文章請查看專欄。
也能夠去做者的博客閱讀文章。
歡迎加入Wasm和emscripten技術交流羣,羣聊號碼:939206522。html


Emscripten支持三種OpenGL編譯模式:git

  • OpenGL ES 2.0/3.0的WebGL子集(默認)----支持OpenGL ES 2.0/3.0中能夠直接映射到WebGL 1/2的子集。
  • 模擬OpenGL ES 2.0/3.0----支持一些WebGL中沒有的OpenGL ES 2.0/3.0特性。
  • 模擬桌面OpenGL API----支持一些OpenGL 1.X 的特性和命令。

本篇文章介紹一些這幾種模式的信息,並告訴你們怎麼啓用這些模式。github

tip:
咱們強烈推薦你的代碼使用OpenGL ES 2.0/3.0的WebGL子集,甚至儘量移植你的代碼到這些API上。其餘兩種模式效率不高,只有你的代碼很是依賴這兩種模式的API的時候(再不得已而)用。

OpenGL ES 2.0/3.0的WebGL子集

默認下,Emscripten編譯代碼爲OpenGL ES 2.0/3.0的WebGL子集。它是OpenGL ES能夠直接映射到WebGL的一些命令。這個子集包括了OpenGL ES 2.0的絕大多數命令,除了客戶端數組(client-sede arrays)和一些其餘特性,能夠在這個地址查看web

爲了針對OpenGL ES的WebGL子集編程,要使用GL ES 2.0頭文件和GL ES 2.0 API,同時遵照WebGL規範第6章中具體的限制(上個地址)。編程

之因此默認狀況下是使用此模式,是由於它能最好匹配瀏覽器提供的WebGL特性。segmentfault

若是想讓編譯後的代碼建立的是WebGL2上下文,請編譯時設置連接標記-s USE_WEBGL2=1。在運行時,指定此標誌會在運行時容許(而且默認狀況下,除非在上下文建立時指定,才能)建立WebGL 2上下文,但仍有可能建立WebGL 1上下文,所以應用程序能夠選擇是否須要WebGL 2,或者是否支持回退到WebGL 1。api

模擬OpenGL ES 2.0/3.0

這種編譯模式模擬了一些不在WebGL 1規範中的OpenGL ES 2.0/3.0特性。數組

尤爲是對OpenGL ES 2.0/3.0的WebGL子集沒有包括進來的客戶端數組(client-sede arrays)提供了模擬。瀏覽器

這容許您在沒有綁定緩衝區的狀況下使用glDrawArrays和glDrawElements等函數,而且Emscripten的GL bindings將自動設置緩衝區(WebGL要求綁定緩衝區)。安全

note:
這種構建模式有一個限制,即客戶端索引緩衝區中最大的索引必須小於該緩衝區的總索引數。

要啓用OpenGL ES 2.0,請指定選項-s FULL_ES2=1。

要啓用OpenGL ES 2.0,請指定選項-s FULL_ES3=1。這就增長了將內存塊映射到客戶端內存的模擬。標記- s FULL_ES2= 1和- s FULL_ES3= 1是正交的,所以能夠指定其中一個或兩個同時指定來模擬不一樣的特性。

模擬桌面OpenGL API

OpenGL模式支持許多遺留在桌面OpenGL 1.x的特性和命令。(例如「immediate mode」和「glNormalPointer」)。

雖然這部分模擬並無完成,但已有的模擬已經足以使用Emscripten將Sauerbraten 3D遊戲(BananaBread項目)和一些其餘的代碼庫移植了。

要啓用這種模式,請指定emcc選項-s LEGACY_GL_EMULATION=1。

優化設置

在這種模式下,除了-s LEGACY_GL_EMULATION=1,還有一些額外的flags能夠用來調整GL 模擬層的性能表現:

  • -s GL_UNSAFE_OPTS=1 嘗試跳過冗餘的GL工做和清理。這種優化不安全,因此默認下不啓用。
  • -s GL_FFP_ONLY=1 告訴GL仿真層,您的代碼將不會使用可編程的管道pipeline/着色器。這容許GL仿真代碼在知道安全的狀況下執行額外的優化。
  • 將Module.GL_MAX_TEXTURE_IMAGE_UNITS整數添加到模板文件.html,以明確代碼使用的紋理單元的最大數。這確保了在檢查固定函數管道(FFP)仿真着色器運行時,GL仿真層不會浪費時鐘週期迭代未使用的紋理單元。(This ensures that the GL emulation layer does not waste clock cycles iterating over unused texture units when examining which Fixed Function Pipeline (FFP) emulation shader to run.)

若是個人代碼依賴一個目前尚不支持的桌面OpenGL特性怎麼辦?

您能夠考慮在Regal桌面OpenGL仿真庫中構建代碼庫,該庫旨在支持OpenGL ES 2.0上的桌面OpenGL功能。根據項目的不一樣,這可能比Emscripten的GL模擬效果更好或更差。

OpenGL ES 擴展

當移植代碼時,應該注意到桌面OpenGL、OpenGL ES和WebGL都有本身的擴展註冊表。這意味着,這三者的擴展都不是自動完成的。請參閱WebGL 1.0擴展註冊表,以得到已註冊擴展的完整列表。

此外,在WebGL中,與桌面或移動OpenGL不一樣的是,擴展必須首先在其公開的特性生效以前被激活。若是您使用一個本地的api 如SDL、EGL、GLUT或GLFW來建立您的GL上下文,那麼這將自動完成大多數擴展。若是使用HTML5 WebGL上下文建立API,則必須顯式地選擇是否自動啓用WebGL擴展。若是在上下文建立時沒有自動啓用擴展,那麼能夠使用HTML5 API函數emscripten_webgl_enable_extension來激活它。調試相關的擴展、草案擴展和供應商-前綴擴展(MOZ_ ,WEBKIT_ )在建立時不會自動啓用,但必須始終手動激活。

當從WebGL 1遷移到WebGL 2時,注意一些WebGL 1擴展遷移到爲 WebGL 2的核心特性,所以它們的功能再也不被宣傳爲GL擴展。這並不意味着這些特性應該被丟棄,而是在WebGL 2中能夠使用這些特性不須要首先這個測試GL擴展的存在。


Emscripten代碼移植系列文章

Emscripten代碼移植主題系列文章是emscripten中文站點的一部份內容。
第一個主題介紹代碼可移植性與限制
第二個主題介紹Emscripten的運行時環境
第三個主題第一篇文章介紹鏈接C++和JavaScript
第三個主題第二篇文章介紹embind
第四個主題介紹文件和文件系統
第六個主題介紹Emscripten如何調試代碼

相關文章
相關標籤/搜索