Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Cosillas Sobre Environment Mapping

Iniciado por boubou, 11 de Agosto de 2004, 11:21:20 AM

« anterior - próximo »

boubou

 Wenas gente, vereis, tengo una duda acerca del efecto este, el environment mapping:

He hecho un efecto que hace pos eso reflejar en la malla todo lo que le rodea, salvo una excepcion:
No me refleja los otros objetos que tengan el susodicho efecto. Ahora os pregunto:
Que me sugeris que haga para que SI se me refleje las otras mallas con environment mapping?

Muchas gracias por adelantado.

Un saludo.

PD: No uso shaders :P
onstruo Bou... Ha vuelto Mwhahahahahahahahahahahahahah!

Es la unica esperanza de los trolls tras el envio al "infienno
" de WhiteBlaizer y X-Alien

DraKKaR

 El environment mapping en realidad no refleja nada. Es simplemente un truco con una textura cúbica que se basa en la modificación correcta de sus coordenadas de textura para dar la sensación de que en realidad está reflejando cosas.

Por lo tanto, aunque tengas otros objetos cerca de esa malla "reflectante" no se van a ver reflejados. Lo que se va a "reflejar" es una textura precalculada.

Si lo que quieres es que se refleje todo, lo único que peudes hacer es actualizar cada cierto tiempo esa textura que representa el mundo que rodea al objeto. Es decir, si estas usando una textura cúbica, haces 6 renders a textura para captar el entorno del objeto y le aplicas esos 6 renders como una textura cúbica con el efecto del environment mapping. De esta manera sí estará reflejando cualquier cosa. Aunque su coste será una burrada XD.

No se si me he explicado bien.

boubou

 Me pondre manos a la obra, a ver si consigo que se reflejen los otros objetos que tengan tambien environment mapping.

Muchas gracias :).
onstruo Bou... Ha vuelto Mwhahahahahahahahahahahahahah!

Es la unica esperanza de los trolls tras el envio al "infienno
" de WhiteBlaizer y X-Alien

boubou

 Hola de nuevo.

He estado observando el efecto este del environment mapping y he notado que me hace cosas raras:





Este es el codigo, a ver si me podeis ayudar:


#include "wiz.h"

int cmesh=0;





LPDIRECT3DCUBETEXTURE9 mapa[9999];
LPDIRECT3DSURFACE9 bufferz_mapa[9999];
bool envmapenable[9999];
void pintar();

void create_envmap(int mesh){

cmesh=mesh;
envmapenable[mesh]=true;
get_d3d_device()->CreateCubeTexture(64,1,D3DUSAGE_RENDERTARGET,get_format().Format,
                           D3DPOOL_DEFAULT,&mapa[mesh],NULL);

get_d3d_device()->CreateDepthStencilSurface(64,64,D3DFMT_D16,D3DMULTISAMPLE_NONE,1,true,&bufferz_mapa[mesh],NULL);


}

void delete_envmap(int mesh){

envmapenable[mesh]=NULL;
mapa[mesh]=NULL;
bufferz_mapa[mesh]=NULL;


}

void render_envmap(int mesh){

get_d3d_device()->SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_DISABLE);

// Se va a calcular la vista del entorno

D3DXMATRIX matriz_proj2,matriz_vista2;
matriz_proj2=get_projection();
matriz_vista2=get_view();
D3DXMATRIX matriz_proj3;
D3DXMatrixPerspectiveFovLH(&matriz_proj3,D3DX_PI/2,1.0f,0.5f,10000.0f);
get_d3d_device()->SetTransform(D3DTS_PROJECTION,&matriz_proj3);

// Se recuperan los buffers de render

LPDIRECT3DSURFACE9 buffer_fondo,buffer_z;
get_d3d_device()->GetRenderTarget(NULL,&buffer_fondo);
get_d3d_device()->GetDepthStencilSurface(&buffer_z);    

// Bucle para cada una de las caras

for(DWORD i=0;i<6;i++)
   {
    D3DXVECTOR3 vector_ojo=D3DXVECTOR3(0,0,0);
    D3DXVECTOR3 vector_objetivo,vector_sup;

       switch(i)
       {
                 case D3DCUBEMAP_FACE_POSITIVE_X:
               vector_objetivo =D3DXVECTOR3(1.0f,0.0f,0.0f);
               vector_sup      =D3DXVECTOR3(0.0f,1.0f,0.0f);
               break;
           case D3DCUBEMAP_FACE_NEGATIVE_X:
               vector_objetivo =D3DXVECTOR3(-1.0f,0.0f,0.0f);
               vector_sup      =D3DXVECTOR3(0.0f,1.0f,0.0f);
               break;
           case D3DCUBEMAP_FACE_POSITIVE_Y:
               vector_objetivo =D3DXVECTOR3(0.0f,1.0f,0.0f);
               vector_sup      =D3DXVECTOR3(0.0f,0.0f,-1.0f);
               break;
           case D3DCUBEMAP_FACE_NEGATIVE_Y:
               vector_objetivo =D3DXVECTOR3(0.0f,-1.0f,0.0f);
               vector_sup      =D3DXVECTOR3(0.0f,0.0f,1.0f);
               break;
           case D3DCUBEMAP_FACE_POSITIVE_Z:
               vector_objetivo =D3DXVECTOR3(0.0f,0.0f,1.0f);
               vector_sup      =D3DXVECTOR3(0.0f,1.0f,0.0f);
               break;
           case D3DCUBEMAP_FACE_NEGATIVE_Z:
               vector_objetivo =D3DXVECTOR3(0.0f,0.0f,-1.0f);
               vector_sup      =D3DXVECTOR3(0.0f,1.0f,0.0f);
               break;
       }

       D3DXMATRIX matriz_vista;

       D3DXMatrixLookAtLH(&matriz_vista,&vector_ojo,&vector_objetivo,&vector_sup);
       get_d3d_device()->SetTransform(D3DTS_VIEW,&matriz_vista);

 // Se asigna la cara
       LPDIRECT3DSURFACE9 cara;
       mapa[mesh]->GetCubeMapSurface((D3DCUBEMAP_FACES)i,0,&cara);  
       
 get_d3d_device()->SetRenderTarget(NULL,cara);
 get_d3d_device()->SetDepthStencilSurface(bufferz_mapa[mesh]);    
       cara->Release();
   
       get_d3d_device()->BeginScene();  
 pintar();
       get_d3d_device()->EndScene();
   }

get_d3d_device()->SetRenderTarget(NULL,buffer_fondo);
   get_d3d_device()->SetDepthStencilSurface(buffer_z);    
buffer_fondo->Release();
   buffer_z->Release();

// Restore the original transformation matrices
   get_d3d_device()->SetTransform(D3DTS_VIEW,       &matriz_vista2);
   get_d3d_device()->SetTransform(D3DTS_PROJECTION, &matriz_proj2);
}




bool get_envmap(int mesh){

return envmapenable[mesh];

}




void pintar(){

get_d3d_device()->SetRenderState( D3DRS_ZENABLE,TRUE);

get_d3d_device()->SetRenderState(D3DRS_CULLMODE,D3DCULL_NONE);  
get_d3d_device()->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,0x00000000,1.0f,0);
 
get_d3d_device()->SetTextureStageState(0,D3DTSS_COLORARG1,D3DTA_TEXTURE);
get_d3d_device()->SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_SELECTARG1);      
get_d3d_device()->SetTextureStageState(0,D3DTSS_TEXCOORDINDEX,D3DTSS_TCI_PASSTHRU);
get_d3d_device()->SetTextureStageState(0,D3DTSS_TEXTURETRANSFORMFLAGS,D3DTTFF_DISABLE);
get_d3d_device()->SetVertexShader(NULL);
for(int i=0;i<=get_max_mesh();i++){
 if(i!=cmesh){wiz_load_identity(i);retransform(i);render_mesh(i);}

}
}



void set_stages(){
get_d3d_device()->SetTextureStageState(0,D3DTSS_COLORARG1,D3DTA_TEXTURE);
  get_d3d_device()->SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_SELECTARG1);
  get_d3d_device()->SetSamplerState(0,D3DSAMP_ADDRESSU,D3DTADDRESS_WRAP);
  get_d3d_device()->SetSamplerState(0,D3DSAMP_ADDRESSV,D3DTADDRESS_WRAP);
     get_d3d_device()->SetSamplerState(0,D3DSAMP_MINFILTER,D3DTEXF_LINEAR);
  get_d3d_device()->SetSamplerState(0,D3DSAMP_MAGFILTER,D3DTEXF_LINEAR);
  get_d3d_device()->SetTextureStageState(0,D3DTSS_TEXCOORDINDEX,
                                   D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR);
  get_d3d_device()->SetTextureStageState(0,D3DTSS_TEXTURETRANSFORMFLAGS,
                                    D3DTTFF_COUNT3);
}
void set_envtex(int mesh){

get_d3d_device()->SetTexture(0,mapa[mesh]);

}

void set_envcurrent_mesh(int m){

cmesh=m;

}



Venga! un saludin!!
onstruo Bou... Ha vuelto Mwhahahahahahahahahahahahahah!

Es la unica esperanza de los trolls tras el envio al "infienno
" de WhiteBlaizer y X-Alien

boubou

 Creeis que podria ser problema de las coordenadas de textura?

Venga hombre, decid algo, please.
onstruo Bou... Ha vuelto Mwhahahahahahahahahahahahahah!

Es la unica esperanza de los trolls tras el envio al "infienno
" de WhiteBlaizer y X-Alien

DraKKaR

 No se a que fallos te refieres, sé mas explicativo.

boubou

 Uys, perdon.

El problema es que en la tetera parece que transparenta lo que hay detras de ella.
onstruo Bou... Ha vuelto Mwhahahahahahahahahahahahahah!

Es la unica esperanza de los trolls tras el envio al "infienno
" de WhiteBlaizer y X-Alien

_Grey

 Si hos fijais en las 2 imagenes, vereis que la tetera gris siempre aparece sobre la tetera con el EM.

No e tratado con el efecto, vale lo reconozco, pero es evidente que se trata de que las coordenadas de textura, no estan bien.... o quizas dibujas la tetera gris en varias direcciones....!? Me apunto a lo primero, de todas formas esto se suele hacer solo con los graficos de fondo, o con una textura hecha de antemano, si te fijas en los juegos veras que pasan de poner objetos independientes, por que tendrias que recalcular las texturas poara cada objeto..uff! espero que se me entienda...

saludos.

boubou

onstruo Bou... Ha vuelto Mwhahahahahahahahahahahahahah!

Es la unica esperanza de los trolls tras el envio al "infienno
" de WhiteBlaizer y X-Alien

boubou

 Bueno, ya lo tengo solucionado, pero se me salta una duda a la cabeza...
Y es esta:

Cuando cambio la posicion de la camara (La tengo apuntando al vector (0,0,0)) la textura se ve igual, no ha cambiado, es decir, que no se ha ajustado la textura para que refleje la escena segun la posicion de la camara.

¿Que tengo que hacer para que no me haga esto? ¿A que huelen las nubes?


Venga, un saludo y gracias a todos.


onstruo Bou... Ha vuelto Mwhahahahahahahahahahahahahah!

Es la unica esperanza de los trolls tras el envio al "infienno
" de WhiteBlaizer y X-Alien

boubou

 Perdonad que sea tan pesao, pero es que sigo teniendo problemas con lo que estaba haciendo.

Mirad lo que le pasa. A que es debido?







Muchas gracias.
onstruo Bou... Ha vuelto Mwhahahahahahahahahahahahahah!

Es la unica esperanza de los trolls tras el envio al "infienno
" de WhiteBlaizer y X-Alien






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.