descargar - OpenGL vs OpenGL ES 2.0: ¿Puede una aplicación OpenGL ser fácilmente portada?
opengl es 2.0 android (5)
Estoy trabajando en una especie de framework de juegos, y soy un recién llegado a OpenGL. La mayoría de los libros parecen no dar una respuesta muy clara a esta pregunta, y quiero desarrollar en mi escritorio usando OpenGL, pero ejecutar el código en un entorno OpenGL ES 2.0. Mi pregunta es doble entonces:
- Si apunto a mi framework para OpenGL en el escritorio, ¿se ejecutará sin modificaciones en un entorno OpenGL ES 2.0?
- Si no, entonces hay un buen emulador, PC o Mac; ¿Hay alguna secuencia de comandos que pueda ejecutar que convierta mi código OpenGL en código OpenGL ES o marque las cosas que no funcionarán?
En OpenGL ES 2.0, que es lo que usan los nuevos gadgets, también debe proporcionar sus propios sombreadores de vértices y fragmentos porque la antigua línea de función fija se ha ido. Esto significa tener que hacer cálculos de sombreado, etc., cosas que serían bastante complejas, pero puede encontrar implementaciones existentes en los tutoriales de GLSL.
Aún así, como GLES es un subconjunto de OpenGL de escritorio, es posible ejecutar el mismo programa en ambas plataformas.
Han pasado unos tres años desde la última vez que realicé algún trabajo de ES, por lo que podría estar desactualizado o simplemente recordar algunas cosas incorrectamente.
No, apuntar a OpenGL para escritorio no es igual a la orientación de OpenGL ES, porque ES es un subconjunto. ES no implementa funciones de modo inmediato (
glBegin()
/glEnd()
,glVertex*()
, ...) Las matrices de vértices son la principal forma de enviar cosas a la canalización.Además, depende del perfil al que se dirige: al menos en el perfil Lite, ES no necesita implementar funciones de punto flotante. En cambio, obtienes funciones de punto fijo; pensar en enteros de 32 bits donde los primeros 16 bits significan los dígitos antes del punto decimal, y los siguientes 16 bits significan los dígitos después del punto decimal.
En otras palabras, incluso el código simple puede ser poco práctico si usa flotantes (debe reemplazar las llamadas a funciones
gl*f()
con llamadas a funcionesgl*x()
.Vea cómo podría resolver este problema en el ejemplo de Trolltech (específicamente el archivo
qtwidget.cpp
; es un ejemplo de Qt, pero aún así ...). Verás que hacen esta llamada:q_glClearColor(f2vt(0.1f), f2vt(0.1f), f2vt(0.2f), f2vt(1.0f));
Esto está destinado a reemplazar la llamada a glClearColorf (). Además, usan macro
f2vt()
- que significa float a tipo de vértice - que convierte automágicamente el argumento de float al tipo de datos correcto.Mientras desarrollaba algunas demos pequeñas hace tres años para una empresa, he tenido éxito trabajando con el SDK de PowerVR . Es para Visual C ++ en Windows; No lo he probado en Linux (no es necesario ya que estaba trabajando en la PC de la empresa).
Una pequeña actualización para reflejar mis experiencias recientes con ES. (7 de junio de 2011)
- Las plataformas de hoy probablemente no usen el perfil Lite, por lo que probablemente no tenga que preocuparse por los decimales de punto fijo
- Cuando transfiera su código de escritorio para dispositivos móviles (por ejemplo, iOS), es muy probable que deba hacer principalmente estos y no mucho más:
- reemplace
glBegin()
/glEnd()
con matrices de vértices - reemplace algunas llamadas a funciones como
glClearColor()
con llamadas comoglClearColorf()
- reescribe tu sistema de ventanas y entrada
- Si se dirige a OpenGL ES 2.0 para obtener la funcionalidad de sombreado, ahora tendrá que reemplazar por completo el comportamiento integrado de la tubería de función fija con sombreadores, al menos los básicos que reimplementan la función fija.
- reemplace
- Realmente importante: a menos que su sistema móvil no tenga restricciones de memoria, realmente debe considerar el uso de compresión de textura para su chip gráfico; por ejemplo, en dispositivos iOS, cargará datos comprimidos PVRTC en el chip
Opción 3) Puede usar una biblioteca como Qt para manejar su código OpenGL usando sus funciones incorporadas. Esto le da la opción de usar una base de código (o bases de códigos mínimamente diferentes) para OpenGL y construir para la mayoría de las plataformas que desee. No es necesario que lo transfiera a cada plataforma diferente que desea admitir. Qt puede incluso elegir el contexto OpenGL basado en las funciones que usa.
Según tengo entendido, OpenGL ES es un subconjunto de OpenGL. Creo que si te abstienes de usar cosas de modo inmediato, como glBegin () y glEND () deberías estar bien. No he hecho mucho con OpenGL en los últimos dos meses, pero cuando estaba trabajando con ES 1.0, siempre y cuando no usara glBegin / glEnd, todo el código que había aprendido del estándar OpenGL funcionaba.
Sé que el simulador de iPhone ejecuta el código OpenGL ES. No estoy seguro del Android.
Aquí está el emulador de Windows.