Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Utilizar Dec3n Y Udec3

Iniciado por Haddd, 06 de Junio de 2004, 10:17:34 PM

« anterior - próximo »

Haddd

 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?

Haddd

 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)  






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.