emscripten/Linux/macOS/mingw-w64 での GLEW を使わない OpenGL 拡張機能のロード
前提(emscriptenとGLEW)
emscripten では、 OpenGL ES 2.0 ベースのコードを WebGL 1.0 で動作させる(Safari で WebGL 2.0 が動作しないため)
emscripten の GLEW サポートは内部で SDL に依存しており、実際には SDL_opengl.h に GL_GLEXT_PROTOTYPES を追加してそれらしい動作を実現している様子。
OpenGL ES で GLEW を使用する場合、 GLEW_USE_LIB_ES11 あるいは GLEW_USE_LIB_ES20 を指定すると、
glew.h から SDL_opengles.h, SDL_opengles2.h がロードされるようになっている。
そもそもオリジナルの GLEW は OpenGL ES をサポートしないようなので、emscriptenでポートという観点からは GLEW を使わないのが正攻法という気もする。
かわりに SDL_GL_ExtensionSupported や SDL_GL_GetProcAddress を使うのが良いだろう。
GLEWを使用しない場合のプラットフォーム別対応
LinuxおよびmacOS環境では GL_GLEXT_PROTOTYPES を有効にしてコンパイル、拡張機能は SDL_GL_GetProcAddress でロードする。
mingw-w64 では GL_GLEXT_PROTOTYPES を有効にすると glActiveTexture などがリンク時に失敗するため、
拡張機能以外であっても必要な関数は定義だけしておき SDL_GL_GetProcAddress を使い動的にロードする。
インスタンシングで使う拡張機能
Vertex Array Object
GenVertexArrays(sizei n, uint *arrays), BindVertexArray(uint array) を提供する
| OpenGL | name | url |
|---|---|---|
| 1.1 | APPLE_vertex_array_object | https://www.khronos.org/registry/OpenGL/extensions/APPLE/APPLE_vertex_array_object.txt |
| 2.1 | ARB_vertex_array_object | https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_vertex_array_object.txt |
| ES 1.1 | OES_vertex_array_object | https://www.khronos.org/registry/OpenGL/extensions/OES/OES_vertex_array_object.txt |
| Web 1.0 | OES_vertex_array_object | https://www.khronos.org/registry/webgl/extensions/OES_vertex_array_object/ |
Instanced Arrays
VertexAttribDivisor(uint index, uint divisor) を提供する
| OpenGL | name | url |
|---|---|---|
| 1.1 | ARB_instanced_arrays | https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_instanced_arrays.txt |
| ES 2.0 | EXT_instanced_arrays | https://www.khronos.org/registry/OpenGL/extensions/EXT/EXT_instanced_arrays.txt |
| ES 2.0 | ANGLE_instanced_arrays | https://www.khronos.org/registry/OpenGL/extensions/ANGLE/ANGLE_instanced_arrays.txt |
| Web 1.0 | ANGLE_instanced_arrays | https://www.khronos.org/registry/webgl/extensions/ANGLE_instanced_arrays/ |
Draw Instanced
DrawArraysInstanced(enum mode, int first, sizei count, sizei primcount) を提供する
| OpenGL | name | url |
|---|---|---|
| 2.0 | ARB_draw_instanced | https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_draw_instanced.txt |
| 2.0 | EXT_draw_instanced | https://www.khronos.org/registry/OpenGL/extensions/EXT/EXT_draw_instanced.txt |
| ES 2.0 | EXT_draw_instanced | https://www.khronos.org/registry/OpenGL/extensions/EXT/EXT_draw_instanced.txt |
| ES 2.0 | EXT_instanced_arrays | https://www.khronos.org/registry/OpenGL/extensions/EXT/EXT_instanced_arrays.txt |
| ES 2.0 | ANGLE_instanced_arrays | https://www.khronos.org/registry/OpenGL/extensions/ANGLE/ANGLE_instanced_arrays.txt |
| Web 1.0 | ANGLE_instanced_arrays | https://www.khronos.org/registry/webgl/extensions/ANGLE_instanced_arrays/ |