2008-11-07 5 views
17

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

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

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

ответ

12

"OpenGL ES 1.1.12 Difference Specification" (PDF), связанный с the OpenGL ES 1.X info page at Khronos.org проходит через различия между OpenGL ES 1.X и OpenGL 1.5. OpenGL ES 1.1 - это версия, используемая на iPhone.

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

+0

Хорошо, что работает. Извините, новичок в ES и не нашел сайт Khronos до тех пор, пока не разместил вопрос (d'oh!) – Olie 2008-11-08 06:09:45

13

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

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

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

+0

Интересно: я не могу найти эту техническую заметку в любом месте.Есть идеи? – cbrulak 2009-02-11 23:00:14

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