Corruption géométriques avec des CubeMaps...

Corruption géométriques avec des CubeMaps... - Divers - Programmation

Marsh Posté le 08-02-2004 à 23:32:02    

http://forum.hardware.fr/hardwaref [...] 55-170.htm
 
Problème de corruption géométrique rencontré avec des cubemaps dans cas particuliers.
 
liens du biniou:
http://site.voila.fr/bjone/DansElmuro.zip  
 
le fichier de technique employé:
 
 

Code :
  1. texture CubeTexture;
  2. matrix matNormals;
  3. technique CubeMappedFrustum
  4. {
  5. pass P0
  6.     {     
  7.  
  8.  VertexShader =
  9.  decl
  10.         {
  11.   stream 0;
  12.   float v0[4];  // position X,Y,Z,RHW
  13.   float v1[3];  // normal
  14.         }
  15.  asm
  16.         {
  17.   vs.1.0;
  18.   mov oPos, v0;
  19.             m3x3 oT0, v1, c0;             
  20.  };       
  21.          
  22.         VertexShaderConstant4[0] = <matNormals>;
  23.      
  24.      Lighting = False;   
  25.  ZEnable  = False;
  26.  CullMode = None;
  27.  Texture[0]   = <CubeTexture>;
  28.  MinFilter[0] = None;
  29.         MagFilter[0] = Linear;
  30.         AddressU[0] = Clamp;
  31.         AddressV[0] = Clamp;
  32.         AddressW[0] = Clamp;
  33.        
  34.         ColorOp[0]   = SelectArg1;
  35.  ColorArg1[0] = Texture;
  36.  AlphaOp[0] = Disable;
  37.  ColorOp[1] = Disable;
  38.  TexCoordIndex[0] = PassThru;
  39.  TextureTransformFlags[0] = Count3;
  40.     }
  41. }


 
la classe c++ coté appli:
 

Code :
  1. class CubeMappedFrustum
  2. {
  3. public:
  4. VertexBuffer VB;
  5. IndexBuffer IB;
  6. ID3DXEffect *Effect;
  7. int xsteps;
  8. int ysteps;
  9. D3DXMATRIX matProject;
  10. float distance,xangle,yangle;
  11. CubeMappedFrustum();
  12. ~CubeMappedFrustum();
  13. void Generate( float xangle, float yangle, float distance, D3DXMATRIX &matProject, unsigned int xsteps=20, unsigned int ysteps=20 );
  14. void Render( D3DXMATRIX &matNormals, IDirect3DCubeTexture8 *CubeTexture );
  15. };


 
 
implémentation:
 
 

Code :
  1. class CMF_vertex
  2. {
  3. public:
  4. float x,y,z,w, nx,ny,nz;
  5. };
  6. void CubeMappedFrustum::Generate( float xangle, float yangle, float distance, D3DXMATRIX &matProject, unsigned int xsteps, unsigned int ysteps )
  7. {
  8. if( this->matProject == matProject && this->xangle == xangle && this->yangle == yangle &&
  9.  this->xsteps == xsteps && this->ysteps == ysteps && this->distance==distance )
  10.  return;
  11. this->matProject=matProject;
  12. this->distance=distance;
  13. this->xangle=xangle;
  14. this->yangle=yangle;
  15. if( this->xsteps != xsteps || this->ysteps != ysteps )
  16. {
  17.  VB.Release();
  18.  IB.Release();
  19.  this->xsteps=xsteps;
  20.  this->ysteps=ysteps;
  21.  VB.Create( xsteps*ysteps, sizeof(CMF_vertex), D3DFVF_XYZRHW|D3DFVF_NORMAL ); // HACK pas de FVF, vertexshader derrière
  22.  IB.Create( (xsteps-1)*(ysteps-1)*6 ); // nombre de segments * 6 indices (3 par triangles,2 triangles par segments)  
  23. }
  24. CMF_vertex *V=(CMF_vertex*) VB.Lock();
  25. float yinc=yangle/(ysteps-1);
  26. float xinc=xangle/(xsteps-1);
  27. float y=-yangle/2;
  28. for( unsigned int i=0 ; i < ysteps ; i++ )
  29. {
  30.  float x=-xangle/2;
  31.  float ny=sin(y); // Y
  32.  for( unsigned int j=0 ; j < xsteps ; j++ )
  33.  {
  34.   float nx=sin(x); // X
  35.   float nz=-sqrt(1-nx*nx - ny*ny); // Z RightHand (Z négatif dans le champ de vision)
  36.   // normale
  37.   V->nx=nx;
  38.   V->ny=ny;
  39.   V->nz=nz;
  40.   // position
  41.   float Vtx[3];
  42.   Vtx[0]=nx*distance;
  43.   Vtx[1]=ny*distance;
  44.   Vtx[2]=nz*distance;
  45.   // projection de la position
  46.   D3DXVec3Transform( (D3DXVECTOR4*)V,(D3DXVECTOR3*)Vtx, &matProject );
  47.   x+=xinc;
  48.   V++;
  49.  }
  50.  y+=yinc;
  51. }
  52. VB.Unlock();
  53. ////////////////
  54. WORD *I=(WORD*)IB.Lock();
  55. for(unsigned int j=0 ; j < ysteps-1 ; j++ )
  56. {
  57.  int base=j*xsteps; // positionnement début de ligne (1ère colonne)
  58.  for( unsigned int i=0 ; i < xsteps-1 ; i++ )
  59.  {
  60.   *I++=base;
  61.   *I++=base+1,
  62.   *I++=base+xsteps;
  63.   *I++=base+xsteps;
  64.   *I++=base+1;
  65.   *I++=base+1+xsteps;
  66.   base++; // colonne suivante
  67.  }
  68. }
  69. IB.Unlock();
  70. }
  71. void CubeMappedFrustum::Render( D3DXMATRIX &matNormals, IDirect3DCubeTexture8 *CubeTexture )
  72. {
  73. VB.SetStreamSource();
  74. IB.SetIndices();
  75. Effect->SetTexture("CubeTexture",CubeTexture);
  76. Effect->SetMatrix("matNormals",&matNormals);
  77. unsigned int Passes;
  78. if( Effect->Begin(&Passes,0) == D3D_OK )
  79. {
  80.  for( unsigned int i=0 ; i < Passes ; i++ )
  81.  {
  82.   if( Effect->Pass(i) == S_OK )
  83.    d3dDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,VB.GetSize(),0, IB.GetSize()/3);
  84.  }
  85.  Effect->End();
  86. }
  87. }


Message édité par bjone le 08-02-2004 à 23:45:13
Reply

Marsh Posté le 08-02-2004 à 23:32:02   

Reply

Marsh Posté le 08-02-2004 à 23:35:33    

j'ai du mal a voir comment une cubemap peut corrompre la geometrie ??

Reply

Marsh Posté le 08-02-2004 à 23:39:31    

ché pas t'essayes mon exe stp ?
 
j'ai soit un bug bizarre dans mon code, soit y'a un effet de bord bizarre au niveau calcul ?
 
sinon il se peut que je traçes un triangle de trop ou avec des vertexs non initialisés mais il me semble avoir vérifié le code, enfin je chie ptet :/

Reply

Marsh Posté le 08-02-2004 à 23:41:24    

---------------------------
Erreur
---------------------------
Unknown exception
---------------------------
OK    
---------------------------
 
 
 
ah ouais ca corromps salement :/
 
(tu nous a pas encore foutu du SSE la dedans toi ? :o :D)


Message édité par chrisbk le 08-02-2004 à 23:41:39
Reply

Marsh Posté le 08-02-2004 à 23:43:20    

ahhhhhhhhhhhhhhhhhhhhhhh merde
je t'ai oublié désolé (cette manie de compiler en release avec tout coché :D)
 


Message édité par bjone le 08-02-2004 à 23:43:44
Reply

Marsh Posté le 08-02-2004 à 23:44:27    

en plus pour ce VS 7.1 doit mettre comme SSE, y doit bien y avoir un memcpy SSE ou un truc du genre :lol:

Reply

Marsh Posté le 08-02-2004 à 23:46:59    

jveux pas le savoir
c'est de la vil segregation [:mmmfff]

Reply

Marsh Posté le 08-02-2004 à 23:50:04    

bon pour commenter le bordel (un petit exemple pratique):
 
xangle/yangle: champs de visions horizontaux et verticaux.. (du frustum de vision)
 
xsteps, ysteps: nombre de vertex par colonne et par ligne.
soit si on a 10,10 on aura un vertexbuffer de 100 vertexs.
9 lignes de 9 paquets de 2 triangles.
 
on a un indexbuffer pour un des triangles indépendants de donc 6*9*9 (6 indices pour les deux trianges pour chaqun des 9 paquets des 9 lignes).
 
genre ça:
 
*---*---*
|     |    |
|     |    |
*---*---*
|     |    |
|     |    |
*---*---*
 
3 pour xsteps & ysteps soit 9 vertexs
 
donc (xsteps-1)*(ysteps-1) carrés fais par deux triangles


Message édité par bjone le 08-02-2004 à 23:54:36
Reply

Marsh Posté le 09-02-2004 à 01:06:51    

bon à priori c'est la projection qui part en vrille à cause du z.....
 
j'ai des NaN sur les vertexs extrêmes  :heink:
nz=-sqrt(1-nx*nx - ny*ny);  
chie dans la colle :/


Message édité par bjone le 09-02-2004 à 01:41:04
Reply

Marsh Posté le 09-02-2004 à 04:59:51    

si l'argument du sqrt est negatif.. euh comment dire..
 
LeGreg

Reply

Marsh Posté le 09-02-2004 à 04:59:51   

Reply

Marsh Posté le 09-02-2004 à 10:08:49    

et vi, c'est con la life des fois :D (c'était ma conversion polaire<->cartésienne qui était daubique à mort :D)


Message édité par bjone le 10-02-2004 à 17:38:42
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed