Foros - Stratos

Programadores => Programación gráfica => Mensaje iniciado por: Haddd en 06 de Junio de 2004, 10:17:34 PM

Título: Utilizar Dec3n Y Udec3
Publicado por: Haddd en 06 de Junio de 2004, 10:17:34 PM
 Bien, pues quiero utilizar estos tipos de datos de los shaders. Yo entiendo que si utilizo, por ejemplo UDEC3, mi único trabajo es empaquetar los valores de la forma que quiere el shader, y para eso utilizo una función de ATI:

//////////////////////////////////////////////////////////////////////
//
// Packed unsigned 10-bit integers which represent 0 to 1024
//
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// |X|X|  (z + 1) * 511.5  |  (y + 1) * 511.5  |  (x + 1) * 511.5  |
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
//
//
DWORD PACK_UDEC3(float x, float y, float z)
{
  // Convert to 0 to (2^10)-1 range
  DWORD dwX = (DWORD) ((x + 1.0f) * 511.5f);
  DWORD dwY = (DWORD) ((y + 1.0f) * 511.5f);
  DWORD dwZ = (DWORD) ((z + 1.0f) * 511.5f);

  return (dwX & 0x3FF) | ((dwY & 0x3FF) << 10) | ((dwZ & 0x3FF) << 20);
}


Es decir me empequeta 3 floats comprendidos entre 0 y 1

Por tanto yo en mi programa empaqueto los vértices utilzando esta función y dividiendo por el valor más grande que tengo:

void CXTerreno::GenerarBufferComprimido()
{ int c;CXVector *v;

BYTE *p=m_VB_Vertices[0]->Bloquear();
BYTE *pc=m_VB_Vertices[1]->Bloquear();

c=(int)m_NVertices;

float b=5000.0f;

while(c-->0) {

 v=(CXVector *)p;

 DWORD d=Video.m_Utilidades.PACK_UDEC3(v->x/b,v->y/b,v->z/b);

 memcpy(pc,&d,4);

 pc+=4;

 p+=12;
}

m_VB_Vertices[0]->Desbloquear();
m_VB_Vertices[1]->Desbloquear();
}


Después en el shader:

  float4 Posicion_Vertice=float4(vin.position,1.0f)*5000.0f;


Y la declaración es:

static D3DVERTEXELEMENT9 Comprimido[] =
{
{ 0,0,D3DDECLTYPE_UDEC3,D3DDECLMETHOD_DEFAULT,D3DDECLUSAGE_POSITION,0 },
{ 1,0,D3DDECLTYPE_FLOAT2,D3DDECLMETHOD_DEFAULT,D3DDECLUSAGE_TEXCOORD,0 },
   D3DDECL_END()
};


Pero no me funciona, no me muestra nada en pantalla. ¿Alguien puede guiarme?
Título: Utilizar Dec3n Y Udec3
Publicado por: Haddd en 08 de Junio de 2004, 09:08:11 AM
 Ya está resuelto. Por cierto, para los que querais saberlo, hay más documentación en Managed Code que en la documentación que no lo es  :huh:

Y se resuelve pq el código de ATI divide entre 511 puesto que utilizado shaders 1.0 y no tiene por defecto el tipo UDEC3. He quitado la división tanto del shader como del packer y ha funcionado. He ganado 10 FPS utilizando compresión sin ningún coste. No está mal (ole)