摘要:對的支持翻譯云荒杯傾本文是專欄系列文章之一,更多文章請查看專欄。這允許仿真代碼在知道安全的情況下執行額外的優化。這意味著,這三者的擴展都不是自動完成的。此外,在中,與桌面或移動不同的是,擴展必須首先在其公開的特性生效之前被激活。
Emscripten對OpenGL的支持
翻譯:云荒杯傾
本文是Emscripten-WebAssembly專欄系列文章之一,更多文章請查看專欄。
也可以去作者的博客閱讀文章。
歡迎加入Wasm和emscripten技術交流群,群聊號碼:939206522。
Emscripten支持三種OpenGL編譯模式:
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 的特性和命令。
本篇文章介紹一些這幾種模式的信息,并告訴大家怎么啟用這些模式。
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)和一些其他特性,可以在這個地址查看。
為了針對OpenGL ES的WebGL子集編程,要使用GL ES 2.0頭文件和GL ES 2.0 API,同時遵守WebGL規范第6章中具體的限制(上個地址)。
之所以默認情況下是使用此模式,是因為它能最好匹配瀏覽器提供的WebGL特性。
如果想讓編譯后的代碼創建的是WebGL2上下文,請編譯時設置鏈接標記-s USE_WEBGL2=1。在運行時,指定此標志會在運行時允許(并且默認情況下,除非在上下文創建時指定,才能)創建WebGL 2上下文,但仍有可能創建WebGL 1上下文,因此應用程序可以選擇是否需要WebGL 2,或者是否支持回退到WebGL 1。
模擬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 APIOpenGL模式支持許多遺留在桌面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如何調試代碼
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/88841.html
摘要:寫在前面之前做過一段時間的的研究,寫過幾個,并且閱讀并翻譯了很多篇官方文檔,今天對這些東西做一個總結。主要是以鏈接形式提供,并附上簡短的說明。歡迎加入和技術交流群,群聊號碼 寫在前面 之前做過一段時間的WebAssembly的研究,寫過幾個WebAssembly Demo,并且閱讀并翻譯了很多篇Emscripten官方文檔,今天對這些東西做一個總結。如果有需要對這塊知識了解的同學,就可...
摘要:運行時環境與大多數應用程序所期望的環境不同。不過程序是要手動交換緩沖區的。第一個主題介紹代碼可移植性與限制第二個主題介紹的運行時環境第三個主題第一篇文章介紹連接和第三個主題第二篇文章介紹第四個主題介紹文件和文件系統第六個主題介紹如何調試代碼 翻譯:云荒杯傾本文是Emscripten-WebAssembly專欄系列文章之一,更多文章請查看專欄。也可以去作者的博客閱讀文章。 Emscrip...
閱讀 1672·2021-10-29 13:11
閱讀 836·2021-09-22 10:02
閱讀 1696·2021-08-20 09:35
閱讀 1558·2019-08-30 15:54
閱讀 2465·2019-08-30 15:44
閱讀 1389·2019-08-29 16:52
閱讀 1104·2019-08-23 12:56
閱讀 762·2019-08-22 15:16