ПрограммированиеФорумГрафика

Собрать OpenGL с помощью Emscripten

#0
12:30, 8 авг 2020

Всем привет. Только начал работать с 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.

#1
2:51, 9 авг 2020

SDL2 попробуй, зачем тебе OpenGL

#2
10:30, 9 авг 2020

Собирать 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 придётся ещё мучительно кому-то писать и отлаживать).

#3
10:34, 9 авг 2020

gkv311
> и имеют примеры приложений
Самое эпичное, что встречал https://oxygine.org/online_demo.php

ПрограммированиеФорумГрафика

Тема в архиве.