2014-02-20 2 views
2

Я пытаюсь открыть OpenGL 1.x код here (исходный код написан regular, BenRichards) в безопасное для WebGL подмножество OpenGL 2.x. Мой план состоит в том, чтобы скомпилировать код с помощью Emscripten, чтобы это приложение C++/SDL работало как JS/WebGL в современном браузере, но для этого я должен исключить использование API GL 1.x, поскольку Emscripten не поддерживает должным образом код GL 1.x, который мы используем с его несовершенным/сломанным кодом эмуляции 1.x. BenRichards также заинтересована в том, чтобы его «новичок» GL 1.x-код был перенесен на более современный GL API, если он работает как на рабочем столе, так и в браузере.Портирование OpenGL 1.x кода в WebGL

Оба BenRichards и я новичок в OpenGL в целом, поэтому мы много учимся делать, чтобы понять, как перенаправить его. Общий подход, по-видимому, заключается в том, чтобы избегать клиентских данных по соображениям производительности (см. here), но я хотел узнать на примере.

Возьмите этот небольшой отрывок из here, например:

void TCell::OnRender() { 
    glPushMatrix(); 
    glColor3ub(color.red, color.green, color.blue); 

    glBegin(GL_QUADS); 
    glVertex2i(20 * column - 40, 20 * row - 40); 
    glVertex2i(20 * column - 20, 20 * row - 40); 
    glVertex2i(20 * column - 20, 20 * row - 20); 
    glVertex2i(20 * column - 40, 20 * row - 20); 
    glEnd(); 
    //.... 
    glPopMatrix(); 
} 

Если кто-то может написать хорошо прокоментированную порт этой общей модели рендеринга в WebGL-иш кода (до сих пор C++, хотя, не JavaScript), это было бы Великий. Это должно послужить отправной точкой для переноса оставшейся части приложения.

Хороший ответ на этот вопрос будет полезен, прежде всего, за ближайшую проблему, с которой я столкнулся, объясняя мыслительный процесс о том, как перевести этот тип кода GL 1.x с немедленным режимом в модель отложенного рендеринга GL 2 .Икс. Внешние ссылки на блоги, руководства и т. Д. Приветствуются/приветствуются.

+5

Вы, похоже, сосредоточены на непосредственном режиме vs вершинных массивов/VBOs. Однако это наименьшее из ваших проблем. WebGL похож на GLES2.x полностью на основе программируемого конвейера. Кроме того, матричный стек недоступен. Вам нужно научиться многим другим вещам, прежде чем вы сможете преобразовать этот код - и для этого уже есть хорошие учебные пособия. Также обратите внимание, что преобразование этого единого кода будет невозможно без дальнейшего контекста, так как существует много состояний GL, которые будут влиять на результат рендеринга, а значительная часть этого должна быть реализована в шейдерах. – derhass

ответ

3

Если вы считаете, сохраняя GL стиль 1.x вместо этого, вы можете быть заинтересованы в этом материале:

https://github.com/stefanhaustein/WebGLue

Edit: Для использования с emscripten, вы можете захотеть, чтобы построить что-то вроде MeshBuilder (в webglue.js) и эмуляция фиксированной функции в C. MeshBuilder упрощает перенос GL-кода начала/конца GL-кода в современный GL, используя в основном те же вызовы для заполнения буфера, который можно повторно использовать. Мы использовали аналогичный подход к порту Quake II в WebGL (но в Java/GWT вместо C)

Смежные вопросы