Что "в" и "вне" OpenGL-ES? (Портирование из OpenGL) - PullRequest
18 голосов
/ 07 ноября 2008

Кажется, что вся документация, которую я могу найти об OpenGL-ES, говорит о том, что «OpenGL-ES похож на OpenGL, но без большого количества вещей. Например, нет glBegin или glEnd».

Хорошо, это здорово. Так чего же еще нет? Или есть список того, что в ? Или, может быть, руководство по портированию?

(В частности, я пытаюсь перенести существующее приложение GL на iPhone, хотя я не хочу обязательно ограничивать свой Q для iPhone.)

Ответы [ 2 ]

14 голосов
/ 07 января 2009

Отчасти проблема в ответе на ваш вопрос заключается в том, что многие вещи отсутствуют, и часто это набор редко используемых или неприменимых битовых флагов. Наилучшим документом, описывающим различия, являются заголовки реализации.

Для платформы, над которой я работаю, я решил сделать ее полностью кросс-платформенной между настольным компьютером и iPhone. Подход, который я выбрал для выяснения этого, - это написать код в OpenGL и посмотреть, где он ломается. Тогда посмотрите в

/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS2.2.sdk/ System/Library/Frameworks/OpenGLES.framework/Headers/ES1/gl.h

и сравните с

/Developer/SDKs/MacOSX10.5.sdk/ System/Library/Frameworks/OpenGL.framework/Versions/A/Headers/gl.h

Эти заголовки очень просты и понятны.

Основное различие, которое я обнаружил до сих пор, заключается в том, что GLdouble отсутствует (все, что использует GLdouble, например, glOrtho и glFrustum, имеет версии GLfloat glOrthof и glFrustumf). Также по какой-то причине не существует gluPerspective или GluPerspectivef.

Вот капля замены:

void gluPerspective( GLfloat fovy, GLfloat aspect, GLfloat zNear, GLfloat zFar )
{
   GLfloat xmin, xmax, ymin, ymax;

   ymax = zNear * tan(fovy * M_PI / 360.0);
   ymin = -ymax;
   xmin = ymin * aspect;
   xmax = ymax * aspect;

   glFrustumf( xmin, xmax, ymin, ymax, zNear, zFar );
}

Поскольку у вас нет glBegin и glEnd, вы должны делать все через glDrawArray или glDrawElements (предпочтительно). Быстрый и грязный пример:

void draw( short x, short y, short w, short h )
{
    const GLshort t[8] = { 0, 0, 1, 0, 1, 1, 0, 1 };
    const GLshort v[8] = { x, y, x+w, y, x+w, y+h, x, y+h };

    glVertexPointer( 2, GL_SHORT, 0, v );
    glEnableClientState( GL_VERTEX_ARRAY );

    glTexCoordPointer( 2, GL_SHORT, 0, t );
    glEnableClientState( GL_TEXTURE_COORD_ARRAY );

    glDrawArrays( GL_TRIANGLE_FAN, 0, 4 );
}

Ознакомьтесь с технической запиской Apple TN2230 «Оптимизация OpenGL ES для iPhone OS» , чтобы узнать некоторые другие советы, которые могут быть полезны при портировании.

Портирование до сих пор было довольно безболезненным для меня, и если ваше приложение не выполняет довольно продвинутые функции OGL или не использует полностью неподдерживаемую функциональность, вы обнаружите свои проблемы, нажав кнопку сборки, и простое исправление станет очевидным при копании немного в файлах gl.h. Фактически, портирование на ES заставляет вас писать хороший оптимизированный код рендеринга.

13 голосов
/ 07 ноября 2008

"Спецификация различий OpenGL ES 1.1.12" (PDF), связанная с Информационная страница OpenGL ES 1.X на Khronos.org показывает различия между OpenGL ES 1.X и OpenGL 1.5. OpenGL ES 1.1 - версия, используемая на iPhone.

Спецификация различий не является самым простым документом, который я когда-либо видел, но его легче читать, чем спецификации OpenGL в целом. Я рекомендую получить список функций OpenGL, которые вы вызываете, а затем искать их в разностном документе. Он покажет вам, поддерживаются ли они в OpenGL ES, и если поддержка является лишь частичной, вы можете перейти к полной спецификации для получения дополнительной информации.

...