iphone opengl opengl-es porting

iphone - ¿Qué está "dentro" y "fuera" de OpenGL-ES?(Portado desde OpenGL)



porting (2)

La "Especificación de diferencia de OpenGL ES 1.1.12" (PDF) vinculada desde la página de información de OpenGL ES 1.X en Khronos.org revisa las diferencias entre OpenGL ES 1.X y OpenGL 1.5. OpenGL ES 1.1 es la versión utilizada en el iPhone.

La especificación de diferencias no es el documento más simple que he visto en mi vida, pero es más fácil de leer que las especificaciones de OpenGL en general. Recomiendo obtener una lista de las funciones de OpenGL a las que llamas y luego buscarlas en el documento de diferencias. Le mostrará si son compatibles con OpenGL ES, y si el soporte es solo parcial, puede ir a las especificaciones completas para obtener más información.

Parece que toda la documentación que puedo encontrar sobre OpenGL-ES dice algo así como que "OpenGL-ES es como OpenGL, pero sin muchas cosas. Por ejemplo, no hay glbegin o glEnd".

OK eso es genial. Entonces, ¿de qué ELSE no hay ninguno? ¿O hay una lista de lo que hay adentro ? ¿O tal vez una guía de portabilidad?

(Específicamente, estoy tratando de mover una aplicación GL existente al iPhone, aunque no quiero limitar necesariamente mi Q al iPhone).


Parte del problema al responder a su pregunta es que faltan muchas cosas y, a menudo, es un conjunto de indicadores de bit raramente utilizados o no aplicables. El mejor documento que describe las diferencias es en realidad los encabezados de implementación.

Para el marco en el que estoy trabajando decidí hacerlo completamente en plataforma cruzada entre el escritorio y el iPhone. El enfoque que tomo al descubrirlo es escribir código en OpenGL y ver dónde se rompe. Luego mira adentro

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

y compararlo

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

Estos encabezados son muy sencillos y fáciles de seguir.

La principal diferencia que he descubierto hasta ahora es que no hay GLdouble (cualquier cosa que use GLdouble como glOrtho y glFrustum tiene una versión GLfloat glOrthof y glFrustumf). También no hay gluPerspective o gluPerspectivef por alguna razón.

Aquí hay una gota en reemplazo:

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 ); }

Como no tiene glBegin y glEND, debe hacer todo a través de glDrawArray o glDrawElements (preferido). Un ejemplo rápido y sucio:

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 ); }

Consulte la Nota técnica TN2230 de Apple "Optimización de OpenGL ES para iPhone OS" para obtener más sugerencias que podrían ser útiles para la migración.

Transmitir hasta ahora ha sido bastante fácil para mí, y a menos que su aplicación haga algunas cosas OGL bastante avanzadas o use funcionalidades completamente incompatibles, encontrará sus problemas pulsando el botón de compilación y una solución simple será aparente al cavar un poco en el gl.h archivos. De hecho, la migración a ES te obliga a escribir un buen código de representación optimizado.