Bump Map 2D

Losersjuegos cuenta con una secciones de ejemplos en su web. Utilice esta sección para consultar o proponer ideas acerca de ellos.

Bump Map 2D

Notapor Barajas » Dom Dic 02, 2012 6:15 am

Aquí dejo un ejemplo simple de como hacer BumpMap en 2D


http://www.youtube.com/watch?v=tbqsYYns ... e=youtu.be

El truco esta en esta función:

//Esto coloca el mapa en pantalla...
// Mapa de relieve, pantalla, posición x de la luz, posición y de la luz.
void RBumpmap(SDL_Surface *bumpmap,SDL_Surface * screen, int LX=0,int LY=0){
int x, y, dx, dy, intensidad,color;
//recorremos el mapa de relieve completamente...
for(y = 1; y <(bumpmap->h)-1; y++ ){
for( x = 1; x <(bumpmap->w)-1; x++ ){
//revisamos la diferencia entre el color del pixeles con respecto al pixel actual.
dx = (getpixel(bumpmap,x+1,y)>>16) - (getpixel(bumpmap,x-1,y)>>16);
dy = (getpixel(bumpmap,x,y+1)>>16) - (getpixel(bumpmap,x,y-1)>>16);
//esto dibuja la luz en la posición dada...
dx = dx - ( LX - x);
dy = dy - ( LY - y);
//si la distancia de la diferencia con el punto donde se encuentra la luz
//es mayor a 256 píxeles, la intensidad de la luz es 0.
if ( sqrt(dx*dx+dy*dy) > 256 ) {
intensidad = 0;
}
//caso contrario, la distancia nos servira para decirnos que tan "blanca" sera la luz
//entre más cercana, mas blanca.
else{
intensidad = 255-sqrt(dx*dx+dy*dy);
}
//lo transformamos a un color entero...
color = RGBtoINT(intensidad,intensidad,intensidad);
//y lo ponemos en pantalla...
putpixel(screen,x,y,color);
}
}
};

//las funciones utilizadas por la función...

//colorea un pixel de un color entero...
void putpixel(SDL_Surface *screen, int x, int y, int color){
int w = screen->w;
int h = screen->h;
if ( ( (x<w)&&(x>=0) ) && ( (y<h)&&(y>=0) ) ){
SDL_LockSurface(screen);
unsigned int *ptr = (unsigned int*)screen->pixels;
int lineoffset = y * (screen->pitch / 4);
ptr[lineoffset + x] = color;
SDL_UnlockSurface(screen);
}
}

//toma el color de un pixel
int getpixel( SDL_Surface *surface, int x, int y ){
Uint32 *pixels = (Uint32 *)surface->pixels;
return pixels[ ( y * surface->w ) + x ];
}

//transforma un color RGB a entero...
Uint32 RGBtoINT(int r, int g, int b){
return (r << 16 ) | (g << 8 ) | b;
}


La explicación técnica (en ingles) esta aquí: http://www.flipcode.com/archives/The_Ar ... ping.shtml
Espero que les sea útil :)
Vi veri universum vivus vici
Avatar de Usuario
Barajas
 
Mensajes: 209
Registrado: Mar Nov 16, 2010 12:06 am

Re: Bump Map 2D

Notapor shackra » Dom Dic 02, 2012 8:37 pm

Barajas, seria bien util que tuvieses un repositorio en bitbucket con todos los ejemplos y codigos fuentes de tus proyectos que haces. ¿Tu manejas las tecnicas de screen scrolling? porqué de verdad me gustaria conocer la tecnica en python...
Avatar de Usuario
shackra
 
Mensajes: 308
Registrado: Lun Jun 15, 2009 4:10 pm
Ubicación: Costa Rica


Volver a Ejemplos

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado