翻譯:雲荒杯傾
本文是Emscripten-WebAssembly專欄系列文章之一,更多文章請查看專欄。
也能夠去做者的博客閱讀文章。
歡迎加入Wasm和emscripten技術交流羣,羣聊號碼:939206522。html
Emscripten支持三種OpenGL編譯模式:git
本篇文章介紹一些這幾種模式的信息,並告訴你們怎麼啓用這些模式。github
tip: 咱們強烈推薦你的代碼使用OpenGL ES 2.0/3.0的WebGL子集,甚至儘量移植你的代碼到這些API上。其餘兩種模式效率不高,只有你的代碼很是依賴這兩種模式的API的時候(再不得已而)用。
默認下,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
這種編譯模式模擬了一些不在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模式支持許多遺留在桌面OpenGL 1.x的特性和命令。(例如「immediate mode」和「glNormalPointer」)。
雖然這部分模擬並無完成,但已有的模擬已經足以使用Emscripten將Sauerbraten 3D遊戲(BananaBread項目)和一些其餘的代碼庫移植了。
要啓用這種模式,請指定emcc選項-s LEGACY_GL_EMULATION=1。
在這種模式下,除了-s LEGACY_GL_EMULATION=1,還有一些額外的flags能夠用來調整GL 模擬層的性能表現:
您能夠考慮在Regal桌面OpenGL仿真庫中構建代碼庫,該庫旨在支持OpenGL ES 2.0上的桌面OpenGL功能。根據項目的不一樣,這可能比Emscripten的GL模擬效果更好或更差。
當移植代碼時,應該注意到桌面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的運行時環境
第三個主題第一篇文章介紹鏈接C++和JavaScript
第三個主題第二篇文章介紹embind
第四個主題介紹文件和文件系統
第六個主題介紹Emscripten如何調試代碼