Showing posts with label delphi. Show all posts
Showing posts with label delphi. Show all posts

Tuesday, April 17, 2012

Mi caso contra OpenGL


OpenGL sirve para hacer gráficas. De acuerdo a la Wikipedia: OpenGL (Open Graphics Library) es una especificación estándar que define una API multilenguaje y multiplataforma para escribir aplicaciones que produzcan gráficos 2D y 3D. La interfaz consiste en más de 250 funciones diferentes que pueden usarse para dibujar escenas tridimensionales complejas a partir de primitivas geométricas simples, tales como puntos, líneas y triángulos. Fue desarrollada originalmente por Silicon Graphics Inc. (SGI) en 1992 y se usa ampliamente en CAD, realidad virtual, representación científica, visualización de información y simulación de vuelo. También se usa en desarrollo de videojuegos, donde compite con Direct3D en plataformas Microsoft Windows.

Y este tema me interesó hace tiempo, pero hasta ahora que estoy dando un curso de graficación en la Facultad de Ciencias de la UNAM, decidí aplicarme y ver qué tanto se podía hacer en OpenGL. Hallé de entrada que hay muchísima documentación y por ende, es fácil encontrar ejemplos, tutoriales, etc. En Google se pueden ver montones de imágenes muy bien logradas con esta biblioteca gráfica. Sin embargo, después de un par de meses de estar lidiando con este asunto encontré que hay cosas que no me convencen. He aquí algunas de ellas:

OpenGL tiene sus virtudes, pues se puede instalar prácticamente en cualquier herramienta de programación. Sin embargo, para cada una hay que seguir pasos diferentes. No tiene un procedimiento estándar para esto y cambia de acuerdo al marco de trabajo que quiera usarse.

  1. Para poder usar OpenGL y sacar provecho del mismo hay que pensar en modelos matemáticos. Uno lo que hace, al programar en OpenGL es crear un medio ambiente tridimensional, el cual es muy flexible en muchos sentidos. El problema es que esto hay que tenerlo presente al programar. Por ejemplo, si queremos crear una esfera, tenemos que escribir el código que haga esto. Si queremos que tenga textura tenemos que escribir las instrucciones que nos permiten "texturizar" el objeto, etc. No obstante, nada de esto podemos verlo "en vivo", es decir, necesitamos correr el programa y ver si nuestro modelo tridimensional matemático es lo que estábamos esperando (cosa que pocas veces sucede).
  2. Las instrucciones de OpenGL vienen en diferentes "formatos". Se puede usar por ejemplo, una instrucción que contenga parámetros enteros, dobles, de punto flotante, y tendremos que hay tres instrucciones diferentes, una para cada formato, en donde se agrega a la instrucción lo siguiente: GLColor* (1.0, 1.0, 1.0);en donde el * representa 3f (3 coordenadas de punto flotante); 3d (tres coordenadas de resolución doble); 3i (tres coordenadas enteras). Esto en mi opinión puede ser muy versátil, pero es confuso.
  3. La curva de aprendizaje es realmente lenta, porque insisto y hago énfasis: OpenGL no tiene un sistema para ir visualizando cómo se van haciendo las cosas de acuerdo a las instrucciones escritas. Hasta que se compila puede verse el resultado final, que de verdad, pocas veces coincide con lo que estábamos pensando.

Para mi gusto, sería mucho más amable tener una herramienta al mejor estilo 3dStudio, el cual permite en muchos casos hacer las imágenes interactivas, poner texturas, luces, trayectorias de la cámara para ver cómo se va a mover, etc. Así como está OpenGL, deja mucho que desear.

Quizás para alguna aplicación específica sea la herramienta adecuada pero hasta el momento usar OpenGL como la biblioteca gráfica de programación, parece ser demasiado complicado y poco amable con el programador.

Tuesday, March 27, 2012

Más sobre el creador de iconos


Hace un par de años escribí sobre un programa que hacía iconos. La idea era crear imágenes en formato .ico para usarlas en mis programas. Sin embargo, hallé que el formato de los iconos en Windows no es trivial y que tiene montones de características. La versión de Delphi, la herramienta que uso, tiene un programa para crear iconos de 16x16 pixeles, pero sólo en 16 colores. Evidentemente eso en la actualidad es poco porque el resultado final se ve demasiado simplón ahora que hay tantas tarjetas gráficas que soportan todo tipo de resoluciones, incluso 1080p, que es la alta definición (HD).

Así, un poco sin querer, hallé un sitio que resuelve mis problemas con los iconos en Delphi y crea imágenes con toda la gama de colores e incluso con transparencia (técnicamente el llamado canal alpha). Implementé la solución y finalmente puedo crear iconos en el formato adecuado. Para ello, lo que hice fue lo siguiente:

  • Tomé una imagen en color que quiero procesar
  • Definí diferentes cuadrículas: desde 16x16 hasta 64x64 pixeles, para la imagen resultante
  • Apliqué el filtro mosaico y así tomé un punto de cada recuadro del mosaico como si representara a todos los puntos dentro de dicho recuadro
  • Generé una imagen bmp que puede ser guardada a disco
  • Usando la rutina mencionada, generé el icono en formato .ico.

Cabe decir que crear iconos significa finalmente cambiar el tamaño de la imagen al que uno desea. Hay una serie de técnicas para hacer esto, las cuales son finalmente algoritmos de interpolación, los cuales son adaptivos y no-adaptivos. Los métodos adaptivos pueden cambiar dependiendo qué están interpolando (límites o texturas suaves), mientras que los no-adaptivos toman a todos los pixeles con el mismo tratamiento.

Entre los métodos no-adaptivos están: vecino más cercano (el que usa Paint, de Microsoft, el cual es bastante burdo), bilineal, bicúbico, spline, sinc, lanczos entre otros. Dependiendo de la complejidad de la imagen estos usan de 0 hasta 256 pixeles adyacentes cuando interpolan. Mientras más pixeles adyacentes usan, más preciso es el resultado final aunque como en todo, más procesamiento exige más tiempo de máquina. No se puede tener todo en la vida.

Los algoritmos adaptivos son complicados y muchos programas usan código propietario para realizar esta tarea. La idea de estos algoritmos es minimizar los "artefactos" (que son manchas o pixeles que no deberían verse), y por ende, algunos de estos métodos no se pueden usar para distorsionar o rotar una imagen.

En mi caso, para reducir una imagen, el método mosaico parece ser lo suficientemente bueno, a pesar de ser bastante trivial de implementar.

A quien le interese el software, escríbame a morsa@la-morsa.com y se lo mando de forma gratuita a su correo de inmediato.