Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Como Implementar El Zbuffer En D3d8

Iniciado por [EX3], 22 de Marzo de 2005, 02:18:21 AM

« anterior - próximo »

[EX3]

 Wenas. Llevo unos dias revisando el codigo de unos ejemplos en D3D que usan Zbuffer y no me aclaro mucho con el tema. Lo que quiero es implementar el ZBuffer en un sistema 2D para poder dibujar un objeto detras o delante de otro sin importar el orden de dibujo, intente hacer listas de ordenamiento pero eso me restaba mucha velocidad en el programa (y mas aun si hablamos de las "maravillas" en cuanto a velocidad se refiere al VB6 :P) y he pensado que seria mas optimo implementar un ZBuffer real, pero no me aclaro con los ejemplos. Se "supone" que logro inicializar el ZBuffer y demas pero si la coordenada Z de los quads es diferente a 0 estos no se dibujan en pantalla. He visto en el codigo que usan matrices para proyecciones y demas historias de lo que deduzco que ya seria trabajar en 3D puro y no como lo he estado haciendo ahora.
El codigo que uso para inicializar el ZBuffer es el siguiente:

Const pi As Single = 3.14159265358979

Dim D3DWindow As D3DPRESENT_PARAMETERS

Dim matWorld As D3DMATRIX
Dim matView As D3DMATRIX
Dim matProj As D3DMATRIX
...

D3DWindow.AutoDepthStencilFormat = D3DFMT_D16
D3DWindow.EnableAutoDepthStencil = 1
...

Call D3DDevice.SetRenderState(D3DRS_ZENABLE, 1)
Call D3DDevice.SetRenderState(D3DRS_ZWRITEENABLE, 1)
...

Call D3DXMatrixIdentity(matWorld)
Call D3DDevice.SetTransform(D3DTS_WORLD, matWorld)

Call D3DXMatrixLookAtLH(matView, Make3DVector(0, 2, 15), Make3DVector(0, 0, 0), Make3DVector(0, 1, 0))
Call D3DDevice.SetTransform(D3DTS_VIEW, matView)

Call D3DXMatrixPerspectiveFovLH(matProj, pi / 4, 1, 0.1, 500)
Call D3DDevice.SetTransform(D3DTS_PROJECTION, matProj)
...

Quisiera saber si alguien podria explicarme los pasos para incializar correctamente el ZBuffer, en caso de que no lo haga correctamente, y como trabajar con el. Otra duda que tengo es sobre el uso de la funcion D3DXSprite.DrawTransform() ya que necesitaria usar esta funcion en caso de trabajar con el ZBuffer en vez de D3DXSprite.Draw() que uso actualmente y cambian algunos parametros por una matriz de transformacion que no tengo ni idea de como se usa para definir el escalado del sprite, posicion y rotacion aunque "supongo" que posiblemente el uso sea similar:

D3DXSprite.Draw( _
   SrcTexture As Direct3DTexture8, _
   SrcRect As Any, _
   Scaling As D3DVECTOR2, _
   RotationCenter As D3DVECTOR2, _
   Rotation As Single, _
   Translation As D3DVECTOR2, _
   Color As Long)

Type D3DMATRIX
   m11 As Single -> Scaling.x
   m12 As Single -> Scaling.y
   m13 As Single -> RotationCenter.x
   m14 As Single -> RotationCenter.y
   m21 As Single -> Translation.x
   m22 As Single -> Translation.y
   m23 As Single
   m24 As Single
   m31 As Single
   m32 As Single
   m33 As Single
   m34 As Single
   m41 As Single
   m42 As Single
   m43 As Single
   m44 As Single
End Type

Seria esto o no tiene nada que ver?
Weno, espero que podais despejarme un poco las dudas sobre el tema, gracias ;)

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

Haddd

 No tiene nada que ver la perspectiva con el ZBuffer. El Zbuffer simplemente es un buffer donde se alamcena la z más cercana y si el objeto que se pinta tiene una z superior, se descarta.

Lo que te da esa supuesta z en 3D es la matriz de proyección, pero eso es en 3D. Al final esa matriz de proyección convierte a la z en un valor que va entre 0 y 1.

Cuando utilizas VertexTransformed, estás indicando que NO VAS A USAR la matriz de proyección ni la de vista, ni la de transformación. Entonces sólo te tienes que preocupar de poner en z un valor que vaya entre 0 y 1.




[EX3]

 
CitarEntonces sólo te tienes que preocupar de poner en z un valor que vaya entre 0 y 1.
Por eso no me dibujaba los objetos, usaba valores inferiores a 0 o superiores o iguales a 1 (con 1 no me dibuja nada). Ya tengo resuelto el dibujo de quads pero ahora tengo el problema para dibujar sprites con coordenada Z ya que D3DXSprite.Draw() solo trabaja con X e Y, supongo que deberia usar D3DXSprite.DrawTransform() pero si al final no uso matrices esta funcion no la podria usar o si? Soporta la interfaz D3DXSprite el ZBuffer?

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

BeRSeRKeR

 Según la documentación del SDK para C++, el método Draw tiene un parámetro "pPosition" que es un vector 3D por lo que supongo que ahí puedes especificar la profundidad. Además, en el método Begin, dos de los posibles flags son D3DXSPRITE_SORT_DEPTH_BACKTOFRONT y D3DXSPRITE_SORT_DEPTH_FRONTTOBACK que supongo que es lo que buscas.

No tengo mucha experiencia con ID3DXSprite así que no puedo decir mucho más.

Saludos.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

[EX3]

 
Cita de: "BeRSeRKeR"Según la documentación del SDK para C++, el método Draw tiene un parámetro "pPosition" que es un vector 3D por lo que supongo que ahí puedes especificar la profundidad.
Pues no se, en la documentacion de la 8.1 tanto en C/C++ como en VB usa vectores de dos dimensiones:
'Declaracion para Visual Basic:
D3DXSprite.Draw( _
  SrcTexture As Direct3DTexture8, _
  SrcRect As Any, _
  Scaling As D3DVECTOR2, _
  RotationCenter As D3DVECTOR2, _
  Rotation As Single, _
  Translation As D3DVECTOR2, _
  Color As Long)

//Declaracion para C/C++:
HRESULT Draw(
 LPDIRECT3DTEXTURE8 pSrcTexture,
 CONST RECT* pSrcRect,
 CONST D3DXVECTOR2* pScaling,
 CONST D3DXVECTOR2* pRotationCenter,
 FLOAT Rotation,
 CONST D3DVECTOR2* pTranslation,
 D3DCOLOR Color
);


Cita de: "BeRSeRKeR"Además, en el método Begin, dos de los posibles flags son D3DXSPRITE_SORT_DEPTH_BACKTOFRONT y D3DXSPRITE_SORT_DEPTH_FRONTTOBACK que supongo que es lo que buscas.
En C/C++ y VB no admite parametros, es mas, ni existen estas constantes en la documentacion de la 8.1 pero si en la de la 9, al menos eso veo en la MSDN via M$ Web. Cambian las declaraciones de las funciones en la version 9 de DirectX?

No se, tal vez tendre abandonar la interfaz D3DXSprite y trabajar integramente con primitivas pudiendo acelerar la implementacion actual mediante listas de vertices y demas historias, no se, tengo que echar un ojo a los ejemplos por que la rotacion de vertices y lo del espejado de la textura no logre implementarla correctamente en su dia.

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

BeRSeRKeR

 Claro, es que lo que te he dicho es para la versión 9.0 de DirectX.

Saludos.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

[EX3]

 Ok, entonces no me queda mas remedio que olvidarme de D3DXSprite y tirar de vertices para los sprites.

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

Sacrifai

 ¿No hay en DirectX ninguna clase para la creación y el manejo de quads?

[EX3]

 Que yo sepa no. Yo al menos para manejar quads creo listas de vertices que luego envio con la funcion DrawPrimitiveUP(), lo mas parecido a lo que tu dices seria la clase D3DXSprite que es la que usaba actualmente para dibujar graficos pero en D3D8 no me admite la coordenada Z.

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt






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.