当前位置: 首页 > Web前端 > HTML5

Emscripten对OpenGL的支持

时间:2023-04-04 23:05:02 HTML5

Emscripten对OpenGL的支持翻译:云与苍凉杯本文为Emscripten-WebAssembly专栏系列之一。更多文章请查看专栏。也可以去作者的博客阅读文章。欢迎加入Wasm和emscripten技术交流群,群聊号:939206522。Emscripten支持三种OpenGL编译模式:WebGLsubsetofOpenGLES2.0/3.0(default)----SupportsthesubsetofOpenGLES2.0/3.0thatcan直接映射到WebGL1/2。EmulateOpenGLES2.0/3.0----支持部分OpenGLES2.0/3.0的特性,WebGL中没有。模拟桌面OpenGLAPI-支持一些OpenGL1.X功能和命令。本文介绍了有关这些模式的一些信息,并告诉您如何启用它们。提示:我们强烈建议您的代码使用OpenGLES2.0/3.0的WebGL子集,甚至尽可能将您的代码移植到这些API。其他两种模式效率不高,只有在您的代码严重依赖这两种模式的API时才应使用(作为最后的手段)。OpenGLES2.0/3.0的WebGL子集默认情况下,Emscripten将代码编译为OpenGLES2.0/3.0的WebGL子集。OpenGLES可以直接映射到WebGL的是一些命令。这个子集包含了OpenGLES2.0的大部分命令,除了client-sede数组和一些其他特性,可以在这个地址查看。为了针对OpenGLES的WebGL子集进行编程,请使用GLES2.0头文件和GLES2.0API,同时遵守WebGL规范第6章(上一个地址)中的具体限制。默认情况下使用此模式,因为它最匹配浏览器提供的WebGL功能。如果希望编译后的代码创建WebGL2上下文,请在编译时设置链接标志-sUSE_WEBGL2=1。在运行时,指定此标志允许(默认情况下,除非在上下文创建时指定,否则不会)在运行时创建WebGL2上下文,但仍然可以创建WebGL1上下文,因此应用程序可以选择是否需要WebGL2,或者是否支持回退到WebGL1。模拟OpenGLES2.0/3.0这种编译模式模拟一些不在WebGL1规范中的OpenGLES2.0/3.0特性。特别是,为未包含在OpenGLES2.0/3.0的WebGL子集中的客户端数组提供了仿真。这允许您在没有绑定缓冲区的情况下使用glDrawArrays和glDrawElements等函数,并且Emscripten的GL绑定将自动设置缓冲区(WebGL需要绑定缓冲区)。注意:这种构建模式有一个限制,即客户端索引缓冲区中的最大索引必须小于缓冲区中的索引总数。要启用OpenGLES2.0,请指定选项-sFULL_ES2=1。要启用OpenGLES2.0,请指定选项-sFULL_ES3=1。这增加了将内存块映射到客户端内存的模拟。标志-sFULL_ES2=1和-sFULL_ES3=1是正交的,因此可以指定一个或两个来模拟不同的特性。模拟桌面OpenGLAPIOpenGL模式支持桌面OpenGL1.x遗留下来的许多功能和命令。(例如“立即模式”和“glNormalPointer”)。虽然这部分模拟并不完整,但有足够的模拟可用于移植Sauerbraten3D游戏(BananaBread项目)和其他一些使用Emscripten的代码库。要启用此模式,请指定emcc选项-sLEGACY_GL_EMULATION=1。优化设置在这种模式下,除了-sLEGACY_GL_EMULATION=1之外,还有一些额外的标志可用于调整GL仿真层的性能:-sGL_UNSAFE_OPTS=1尝试跳过冗余的GL工作和清理。此优化并不安全,因此默认情况下未启用。-sGL_FFP_ONLY=1告诉GL仿真层您的代码将不使用可编程管道/着色器。这允许GL仿真代码在已知安全时执行额外的优化。将Module.GL_MAX_TEXTURE_IMAGE_UNITS整数添加到模板file.html以指定代码使用的纹理单元的最大数量。这确保了GL仿真层在检查固定功能管道(FFP)仿真着色器运行时不会浪费时钟周期迭代未使用的纹理单元。(这确保了GL仿真层在检查要运行的固定功能管道(FFP)仿真着色器时不会浪费时钟周期迭代未使用的纹理单元。)如果我的代码依赖于当前不支持的桌面OpenGL功能怎么办?您可以考虑在RegalDesktopOpenGLEmulationLibrary中构建您的代码库,该库旨在支持OpenGLES2.0上的桌面OpenGL功能。根据项目的不同,这可能比Emscripten的GL仿真更好或更差。OpenGLES扩展移植代码时,应注意桌面OpenGL、OpenGLES和WebGL都有自己的扩展注册表。这意味着,这三个扩展都不是自动完成的。有关已注册扩展的完整列表,请参阅WebGL1.0扩展注册表。此外,在WebGL中,与桌面或移动OpenGL不同,扩展必须先被激活,然后它们公开的功能才能生效。如果您使用像SDL、EGL、GLUT或GLFW这样的原生API来创建您的GL上下文,那么这将自动完成大部分扩展。如果您使用HTML5WebGL上下文创建API,则必须明确选择是否自动启用WebGL扩展。如果在创建上下文时未自动启用扩展,则可以使用HTML5API函数emscripten_webgl_enable_extension激活它。与调试相关的扩展、草案扩展和供应商前缀扩展(MOZ_、WEBKIT_)在创建时不会自动启用,但必须始终手动激活。当从WebGL1迁移到WebGL2时,请注意一些WebGL1扩展已迁移为WebGL2的核心功能,因此它们的功能不再被宣传为GL扩展。这并不意味着这些特性应该被丢弃,而是这些特性可以在WebGL2中使用,而无需首先存在这个测试GL扩展。Emscripten代码移植系列文章Emscripten代码移植主题系列是emscripten中文站点的一部分。第一篇介绍代码的可移植性和局限性第二篇介绍Emscripten的运行环境第三篇第一篇介绍连接C++和JavaScript第三篇第二篇介绍embind第四篇介绍文件和文件系统第六篇介绍Emscripten如何调试代码