Всем привет. Только начал работать с Emscripten и не совсем понимаю каким образом можно собрать проект с использованием OpenGL.
Собирал обычные проекты по типу Hello World. Этот проект пробовал собрать следующим образом:
emcc -I"D:/Work/freeglut/include" test/testgl/testgl/testgl.cpp -o hellp.html -s LEGACY_GL_EMULATION=1 -s GL_UNSAFE_OPTS=0
Но в итоге выдает следующие ошибки:
https://gamedev.ru/files/images/?id=148698
Подскажите, пожалуйста, как правильно собрать данный проект с помощью Emscripten.
SDL2 попробуй, зачем тебе OpenGL
Собирать OpenGL приложение под WebAssembly - бесперспективное занятие. WebAssembly поддерживает только WebGL 1.0 / 2.0, которые близки к OpenGL ES 2.0 / 3.0, а десктопный OpenGL реализуется только как слишком ограниченный костыль (что он и пишет в первой же строчке лога на скриншоте). Иначе приложение придётся сильно переписывать и адаптировать.
В любом случае, собрать просто C++ проект со стандартным main() и знающим только Windows/Linux/macOS не получится - надо будет написать минимальный HTML код, инициализирующий страничку и canvas с WebGL контекстом, к которому прицепиться в C/C++ коде - с учётом особенностей браузеров (отсутствие бесконечного цикла отрисовки, специфичные колбеки для обработки мышиных и клавиатурных событий, отсутствие синхронного доступа к файловой системе и прочего). Поэтому проще всего найти библиотеки, которые это всё уже обернули и заявляют о поддержке Emscripten (и имеют примеры приложений).
Можно пробовать мучить приложение использующее OpenGL ES 2.0+ - набор доступных функций очень близок (за парой исключений - Emscripten и WebGL не реализует методы мапирования вершинного буфера вроде glMapBufferRange()) и шейдеры почти совместимы (но можно наткнуться на параноидальное следование WebGL стандарту, и то что прекрасно компилируется на железных OpenGL ES 2.0 драйверах откажется компилироваться в браузере).
С OpenGL ES контекстом начать работать можно либо используя EGL обёртку в Emscripten (которая тоже немного недоделанная, но использовать можно в кроссплатформенном движке, что удобно) либо создав WebGL контекст отдельным API реализованным в Emscripten. Но есть нюансы с расширениями - в отличие от нормального OpenGL / OpenGL ES, многие WebGL расширения недоступны, пока не позовёшь "активатор" emscripten_webgl_enable_extension().
Придётся также смириться с бесконечной отсталостью браузеров, а именно полное отсутствие функциональности OpenGL ES 3.1+ версий, которые уже как несколько лет стали стандартом для мобилок. В первую очередь это отсутствие Compute Shaders и Geometry Shaders, что может стать реальным ограничением для современных движков. При этом не похоже, чтобы браузеры были заинтересованы "прокачать" WebGL до актуального состояния - вместо этого они разрабатывают WebGPU, который ближе к таким API как Vulkan (но не повторяет его, поэтому прослойку в Emscripten, котору реализующую трансляцию С Vulkan вызовов в WebGPU придётся ещё мучительно кому-то писать и отлаживать).
gkv311
> и имеют примеры приложений
Самое эпичное, что встречал https://oxygine.org/online_demo.php
Тема в архиве.