Что & # 8220; в & # 8221; и & # 8220; out & # 8221; OpenGL-ES? (Портирование из OpenGL)
Вопрос
Кажется, что вся документация, которую я могу найти об OpenGL-ES, говорит о том, что "OpenGL-ES похож на OpenGL, но без большого количества материала". Например, нет glBegin или glEnd. & Quot;
Хорошо, это здорово. Так чего же еще нет? Или есть список того, что в ? Или, может быть, руководство по портированию?
(В частности, я пытаюсь перенести существующее приложение GL на iPhone, хотя я не хочу обязательно ограничивать свой Q для iPhone.)
Решение
" 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, и если поддержка является лишь частичной, вы можете перейти к полной спецификации для получения дополнительной информации.
Другие советы
Отчасти проблема в ответе на ваш вопрос заключается в том, что многие вещи отсутствуют, и часто это набор редко используемых или неприменимых битовых флагов. Наилучшим документом, описывающим различия, являются заголовки реализации.
Для платформы, над которой я работаю, я решил сделать ее полностью кросс-платформенной между настольным компьютером и 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 / Версии / 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 заставляет вас писать хороший оптимизированный код рендеринга.