Artículo perteneciente a la sección de motores gráficos
Hola a todos,
En este capitulo nos encargaremos de mejorar el pintado de gráficos 2D por pantalla.
Por un lado, haremos que los gráficos se pinten con el tamaño del gráfico original y no a un valor hardcodeado por código y en segundo lugar permitiremos cargar diferentes tipos de formatos gráficos.
Para pintar gráficos con un tamaño especifico solamente hemos de texturizar en un quad del tamaño que a nosotros nos interese. La información del tamaño del quad la perdemos al eliminar el objeto de gráfico, así que tendremos que guardarlo de alguna forma.....
//Creamos una estructura donde almacenaremos el identificador de textura y sus dimensiones
typedef struct
{
int texture; //Almacenamos el identificador de textura
int w,h; //Ancho y largo de la textura original
}TGraf;
//Modificamos la función de carga...
int A2D_Load(char cad[])
{
GLuint tex;
corona::Image* imagen=NULL;
cout << "Cargamos recurso: " << cad << "\n";
imagen = corona::OpenImage(cad, corona::PF_R8G8B8A8 , corona::FF_AUTODETECT);
if(imagen==NULL)
{
cout << "Recurso no cargado\n";
return -1;
}
printf("Ancho:%d Alto:%d\n",imagen->getWidth(),imagen->getHeight());
glGenTextures(1, &tex);
glBindTexture(GL_TEXTURE_2D, tex);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, imagen->getWidth(), imagen->getHeight(),0, GL_RGBA, GL_UNSIGNED_BYTE, imagen->getPixels());
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
GrafList[index_graf].texture = tex;
GrafList[index_graf].h = imagen->getHeight();
GrafList[index_graf].w = imagen->getWidth();
tex = index_graf;
index_graf++;
delete imagen;
cout << "Recurso cargado\n";
return tex;
}
Y modificamos la función de pintado:
void A2D_Draw(float x, float y, int id)
{
int tex,w,h;
tex = GrafList[id].texture;
w = GrafList[id].w;
h = GrafList[id].h;
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, tex);
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
glBegin(GL_QUADS);
glTexCoord2f( 1.0f, 1.0f); glVertex2i( x + w , y + h );
glTexCoord2f( 0.0f, 1.0f); glVertex2i( x , y + h );
glTexCoord2f( 0.0f, 0.0f); glVertex2i( x , y );
glTexCoord2f( 1.0f, 0.0f); glVertex2i( x + w , y );
glEnd();
}
En cuanto a usar diferentes formatos gráficos corona nos lo deja muy fácil ya que solo nos pide que usemos la siguiente linea:
imagen = corona::OpenImage(cad, corona::PF_R8G8B8A8 , corona::FF_AUTODETECT);
Finalmente, pondremos un código de ejemplo para comprobar como funciona:
#include "Arnow2D.h"
GLuint graf[10];
void Draw(void)
{
int i,j;
A2D_Draw(0,0,graf[0]);
A2D_Draw(500,0,graf[1]);
A2D_Draw(0,300,graf[2]);
A2D_Draw(500,300,graf[3]);
}
void Main_Loop(void)
{
while(1)
{
//Limpiamos la pantalla
A2D_Clear();
Draw();
//Renderizamos la escena
A2D_Render();
}
}
int main(void)
{
A2D_Init();
graf[0] = A2D_Load("img_test.png");
graf[1] = A2D_Load("images.jpg");
graf[2] = A2D_Load("78bc6b62fEySW.gif");
graf[3] = A2D_Load("ejemplo.bmp");
Main_Loop();
A2D_DeInit();
}
Espero , que aunque sencillo, os haya ayudado, en breve más. Creo que en el próximo capitulo implementaré las z's. Si teneis sugerencias aqui estoy esperandolas
Os dejo el archivo con todo el código y los ejemplos aqui
Nos vemos
Blog de programación enfocado a estudiantes principiantes de C/C++ en español. Dispone de cursos de todos los niveles y para multitud de usos.
Entradas populares
-
Una pregunta que me hacen en muchas ocasiones es ¿¿qué significa %2?? La respuesta tiene dos acepciones en función de si lo estamos u...
-
<< Ejemplo anterior Artículos Relacionados Ejemplo siguiente >> Hola a todos, ASCII Art es el hecho de hacer di...
-
Articulo perteneciente a : Referencias de programación Hola a todos Os pongo una aportación que a más de uno le irá bien, un resumen de ...
-
<< Capítulo anterior Artículos Relacionados Capítulo siguiente >> Hola a todos... Un compañero vuestro ha...
-
<< Ejemplo anterior Artículos Relacionados Ejemplo siguiente >> Hola a todos, El ejercicio de hoy se basa en c...
-
Capítulo perteneciente al tutorial de opengl desde cero Hola a todos, Antes que nada quiero que tengáis en cuenta que gran parte de lo q...
-
<< Capítulo anterior Artículos Relacionados Capítulo siguiente >> El c apitulo de hoy trata sobre las instrucc...
-
<< Capítulo anterior Artículos Relacionados Capítulo siguiente >> Hola a todos, Este tutorial intenta ser e...
-
<< Capítulo anterior Artículos Relacionados Capítulo siguiente >> Bienvenidos a un nuevo capitulo del curso ...
-
<< Ejemplo anterior Artículos Relacionados Ejemplo siguiente >> Hola a todos, Hoy toca un ejemplo muy muy sencil...
0 comentarios :
Publicar un comentario