Подтвердить что ты не робот

Что "в" и "вне" OpenGL-ES? (Портирование из OpenGL)

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

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

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

4b9b3361

Ответ 1

"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, и если поддержка является частичной, вы можете перейти к полной спецификации для получения дополнительной информации.

Ответ 2

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

Для рамки, над которой я работаю, я решил сделать ее полностью перекрестной платформой между настольным компьютером и 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, имеет glfratof glfrthof и 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 рода сил вы должны написать хороший оптимизированный код рендеринга.