Foros - Stratos

Programadores => Programación gráfica => Mensaje iniciado por: boubou en 11 de Agosto de 2004, 11:21:20 AM

Título: Cosillas Sobre Environment Mapping
Publicado por: boubou en 11 de Agosto de 2004, 11:21:20 AM
 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
Título: Cosillas Sobre Environment Mapping
Publicado por: DraKKaR en 11 de Agosto de 2004, 11:51:55 AM
 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.
Título: Cosillas Sobre Environment Mapping
Publicado por: boubou en 11 de Agosto de 2004, 12:19:42 PM
 Me pondre manos a la obra, a ver si consigo que se reflejen los otros objetos que tengan tambien environment mapping.

Muchas gracias :).
Título: Cosillas Sobre Environment Mapping
Publicado por: boubou en 12 de Agosto de 2004, 02:32:38 PM
 Hola de nuevo.

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


(http://wizgames.se32.com/envmap.jpg)
(http://wizgames.se32.com/envmap1.jpg)

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!!
Título: Cosillas Sobre Environment Mapping
Publicado por: boubou en 13 de Agosto de 2004, 06:22:34 PM
 Creeis que podria ser problema de las coordenadas de textura?

Venga hombre, decid algo, please.
Título: Cosillas Sobre Environment Mapping
Publicado por: DraKKaR en 13 de Agosto de 2004, 08:31:47 PM
 No se a que fallos te refieres, sé mas explicativo.
Título: Cosillas Sobre Environment Mapping
Publicado por: boubou en 13 de Agosto de 2004, 09:13:48 PM
 Uys, perdon.

El problema es que en la tetera parece que transparenta lo que hay detras de ella.
Título: Cosillas Sobre Environment Mapping
Publicado por: _Grey en 13 de Agosto de 2004, 10:25:41 PM
 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.
Título: Cosillas Sobre Environment Mapping
Publicado por: boubou en 14 de Agosto de 2004, 10:56:09 AM
 Ok, gracias tio.
Título: Cosillas Sobre Environment Mapping
Publicado por: boubou en 18 de Agosto de 2004, 09:26:46 AM
 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.


Título: Cosillas Sobre Environment Mapping
Publicado por: boubou en 21 de Agosto de 2004, 11:45:40 AM
 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?

(http://wizgames.se32.com/envmap.jpg)

(http://wizgames.se32.com/envmap1.jpg)

(http://wizgames.se32.com/envmap2.jpg)

Muchas gracias.