Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





50+50=101!

Iniciado por Haddd, 04 de Febrero de 2004, 10:44:48 PM

« anterior - próximo »

Haddd

 fijaos en esto:



Estoy utilizando tiles de 50x50. La cuestión es que dibujo uno al lado del otro y me aparece un pixel enmedio. No sé de que es. La cuestión es que, debido a la coma flotante, pudiera ser, porque el Clip Space que es lo que al final le pasas al shader, funciona con coordenadas en coma flotante entre -1  y 1

Yo utilizo esta fórmula para pasar de coordenadas de pantalla a Clip Space:

w=(float)Video.m_Informacion.Ancho()-1;

h=(float)Video.m_Informacion.Alto()-1;

l=m_Vertices;

m_BB.PrepararParaBB();

for(c=0;c<4;c++) {
 v=m_VerticesLocal[c]*m_MatrizFinal;
 // Ahora tenemos la posición en formato pantalla, pero debemos
 // pasarlo a la posición en formato CLIP SPACE que es
 // de -1 a 1 por ancho y por alto
 l->x=(v.x/w)*2.0f;
 l->y=(v.y/h)*2.0f;
 l->x-=1.0f;l->y=1.0f-l->y;
                              l++;
               }


¿Alguna idea ?

ethernet

 Yo haria lo siguiente:

miraria si antes del escalado tienes bien los vertices (supongo que v.x y v.y son float) y estan separados un pixel como realmente tu quieres.y si no tomaria el tamaño maximo de anchura, por ejemplo 768 y miraria que codificacion en punto flotante una vez clipeados produce. Con eso te vas a mirar el formato ieee ( printf("%x",*(unsigned*)&var_float); ) y ves a ver si la pifia. Aunque yo dudo mucho que la cague porque si redondea deberia como muy malo empezar en el mismo pixel.

saludos

Loover

 ¿Has restado -0.5f y -0.5f en los ejes x,y en la vista para que los texeles alinien con los píxeles de pantalla?
¿Y al final has puesto que el area del backbuffer sea standard? Se puede pedir a win32 una area de trabajo en la ventana con AdjustWindowRectEx, para que el backbuffer tenga tamaños standard y no de los problemas esos que puse en el otro post.
Lo mismo el problema es uno de esos 2, recuerdo que cuando no restaba el 0.5 me daba errores parecidos.

Yo para 2d inicializo así la vista así:

/*
==================
Configura la vista
==================
*/
inline bool LOV_Render::SetViewPort (int pX,
         int pY,
         int pWidth,
         int pHeight,
         byte pR,
         byte pG,
         byte pB,
         bool pClear)
{
// ----- Si la región de vista queda fuera del frame buffer devolvemos error -----

if (pX +  pWidth > mInfo.mFBWidth) return 0;
if (pX < 0)       return 0;
if (pY + pHeight > mInfo.mFBHeight) return 0;
if (pY < 0)       return 0;

// ----- Matriz de mundo -----

D3DXMATRIX mMatWorld;
mInfo.mDevice->SetTransform (D3DTS_WORLD, D3DXMatrixIdentity (&mMatWorld));

// ----- Matriz de vista -----

D3DXMATRIX mMatView, mTrans;
D3DXVECTOR3 mEyePt  (0.0f, 0.0f, -5.0f);
D3DXVECTOR3 mLookatPt (0.0f, 0.0f, 0.0f);
D3DXVECTOR3 mUpVec  (0.0f, 1.0f, 0.0f);
D3DXMatrixLookAtRH (&mMatView, &mEyePt, &mLookatPt, &mUpVec);
D3DXMatrixRotationZ (&mTrans, D3DX_PI);
D3DXMatrixMultiply (&mMatView, &mTrans, &mMatView);
// 0.5 => Para ajustar con el texel
D3DXMatrixTranslation (&mTrans, -(pWidth/2) -0.5f, -(pHeight/2) -0.5f, 0);
D3DXMatrixMultiply (&mMatView, &mTrans, &mMatView);
mInfo.mDevice->SetTransform (D3DTS_VIEW, &mMatView);

// ----- Matriz de proyección -----

D3DXMATRIX mMatProj;
D3DXMatrixOrthoRH (&mMatProj, (float) pWidth, (float) pHeight, -2048.0f, 2048.0f);
mInfo.mDevice->SetTransform (D3DTS_PROJECTION, &mMatProj);

// ----- Región de vista  -----

//D3DVIEWPORT9 mViewData = { pX, pY, pWidth, pHeight, -2048.0f, 2048.0f };
//mInfo.mDevice->SetViewport (&mViewData);

// ----- Limpiamos el BackBuffer  -----

if (pClear)
 mInfo.mDevice->Clear (0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB (pR, pG, pB), 1.0f, 0);

return 1;
}


Y a la hora de crear la ventana:

 // Requerimos un backbuffer de tamaño estandard en modo ventana
 RECT mRect;
 mRect.right = pWidth;
 mRect.bottom = pHeight;
 mRect.left = 0;
 mRect.top = 0;

 AdjustWindowRectEx (&mRect,
      WS_SYSMENU | WS_BORDER | WS_CAPTION | WS_VISIBLE,
      0,
      WS_EX_CLIENTEDGE);

 // Creamos la ventana
 mAttributes.mWnd = CreateWindowEx (WS_EX_CLIENTEDGE,  
            "Window",    
          pTitle,
          WS_SYSMENU | WS_BORDER | WS_CAPTION | WS_VISIBLE,
           0, 0,
          mRect.right - mRect.left, mRect.bottom - mRect.top,
          NULL,
          NULL,
          mAttributes.mInst,  
          NULL);


Con un poco de suerte es uno de esos dos problemas.
IndieLib Libreria 2.5d utilizando aceleración por hardware para la programación de juegos 2d.
Indie Rover The monkeys are reading!

fiero

 Yo creo que en la operación:

l->x=(v.x/w)*2.0f;
l->y=(v.y/h)*2.0f;

w y h deberían ser las dimensiones de la pantalla, y no el último pixel de la pantalla. Por lo que no deberias restar el -1 en:

w=(float)Video.m_Informacion.Ancho()-1;
h=(float)Video.m_Informacion.Alto()-1;

Igual tienes algún desfase por eso.

un saludo
www.videopanoramas.com Videopanoramas 3D player

Haddd

 Cierto, lo del -1 era restos de pruebas.

A ver lo del 0.5/w sólo se utiliza en coordenadas de textura.

Loover, tu no utilizas RHWZ para las coordenadas, ¿verdad?

Sigo con el problema. ¿nadie me ayuda?  

Loover

 ¿Te refieres a los transformados? No, uso D3DFVF_XYZ | D3DFVF_TEX1
¿Has probado lo que te dije?
IndieLib Libreria 2.5d utilizando aceleración por hardware para la programación de juegos 2d.
Indie Rover The monkeys are reading!

Haddd

 Bien, yo con RHZW. Tendré que hacer pruebas y mirar cuando ocurre el Viewport Scaling. Probé lo que me dijiste, pero no es eso. Tendré que seguir intentándolo....

Loover

 Los transformados me dieron ciertos problemas de escala. Además, creía que no se los podía escalar / rotar multiplicándolos por matrices.
¿Será algún problema del shader?
IndieLib Libreria 2.5d utilizando aceleración por hardware para la programación de juegos 2d.
Indie Rover The monkeys are reading!






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.