venerdhi escribió:Otra pregunta, si cargo una imagen png con sdl_image, se supone qeu tiene un canal alpha al cargarse? En ese caso, podría acceder al canal alpha? Alguién lo ha hecho alguna vez?
Sí, tendrá el canal alpha del archivo PNG original, y luego de crear
una superficie a partir de ese archivo podrás acceder a la tonalidad y
transparencia de cada pixel. Observa el código del programa que te comenté
anteriormente, ahí encontrarás funciones para acceder a cada componente
de color (incluido el canal alfa) y modificarlo. Las funciones
se llaman "get_pixel_color" y "set_pixel_color".
A grandes rasgos, los pixeles de una superficie están compuestos de 4
valores numéricos: "red", "green", "blue" y "alpha". Alterar estos
valores es un poco difícil porque, en principio, no están separados. Por
ello es aconsejable utilizar funciones, hace mas sencilla la tarea.
venerdhi escribió:... y me hice un efecto blending a mano pixel a pixel, pero eso es lento y costoso computacionalmente con imagenes grandes, por eso esperaba que sdl tuviese alguna forma de hacerlo sin tener qeu hacerlo a mano, en cualquier caso, echare un vistazo a los códigos para prepararme para lo peor, jajaja
Es cierto, manipular pixel a pixel una imagen grande puede ser
algo lento... pero en muchos casos esta velocidad es imperceptible.
Sería prudente no "optimizar" o "evaluar" antes de tiempo, en su lugar
uno puede escribir el programa, ejecutarlo y preguntarse: ¿realmente
funciona tan lento?, ¿que tan grandes son esas superficies?, o ¿que
puedo mejorar para hacerlo mas rápido?. Generalmente no nos hacemos
esta última pregunta porque funciona rápido la primera vez (de verdad).
Al menos en el ejemplo de superficies que construí para la web, el
rendimiento del programa me pareció muy bueno, incluso sin tener una
tarjeta aceleradora de gráficos. Ten en cuenta que los lenguajes como
C o C++ son bastante rápidos para hacer esta clase de cosas.
Otra forma de hacer tu programa mas rápido, es agilizar impresiones en
pantalla que realiza "blit", para esto necesitas convertir todas las
superficies al formato de color que utiliza la pantalla principal; la
función que realizar esta tarea es "SDL_DisplayFormat", o bien la
función "SDL_DisplayFormatAlpha" si tus superficies tienen canal "alpha":
http://www.libsdl.org/cgi/docwiki.cgi/S ... ormatAlpha
Ten en cuenta que muchas otras bibliotecas como OpenGL te permiten
realizar todas estas tareas de blending de manera mucho mas rápida debido
a que utilizan el Hardware de una tarjeta aceleradora de gráficos. SDL
intenta ser independiente de esa clase de Hardware, ese es uno de los
motivos por el que no existe esa funcionalidad en la biblioteca base.
igual... ojo, a mí me gustaría que tuviera efectos de blending, pero
bueno, no los tiene. El punto es que vos conoces mejor a tu juego que
los desarrolladores de SDL, por lo tanto, vos podes construir funciones
de 'blending' mas cercanas a tus necesidades, y por lo tanto mas
directas, breves y eficientes.
Saludos.