Foros - Stratos

Programadores => Programación gráfica => Mensaje iniciado por: Cronodragón en 01 de Enero de 1970, 01:00:00 AM

Título: Orden de construcción del terreno
Publicado por: Cronodragón en 01 de Enero de 1970, 01:00:00 AM
                                Ya tengo mi algoritmo de terreno listo, pero me queda un problemilla que no se si es mi culpa o de DirectX, o talvez haya un truco para quitarmelo de encima. Resulta que cuando construyo el terreno debo comenzar desde el fondo acercandome hasta la cámara, de otra forma no se dibuja bien. Pero cuando me muevo con la cámara y miro por detrás del terreno, resulta que se dibuja alrevés. Cómo hago para solucionar esto?, alguien ha sufrido el mismo problema? Gracias.

- Marco
                               
Título: Orden de construcción del terreno
Publicado por: Drácula en 01 de Enero de 1970, 01:00:00 AM
                                Significa que no tienes el ZBuffer establecido, o que no lo borras al hacer un Clear.                                
Título: Orden de construcción del terreno
Publicado por: Cronodragón en 01 de Enero de 1970, 01:00:00 AM
                                Creo que más bien podría ser lo del ZBuffer, cómo puedo cambiarlo?                                
Título: Orden de construcción del terreno
Publicado por: AgeR en 01 de Enero de 1970, 01:00:00 AM
                                Este es el código que gasto yo (estoy empezando, pero creo que es la forma estandar)

Activar el Z-Buffer :
m_pD3DDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);

Borrar el Z-Buffer :
m_pD3DDevice->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);

Espero que te sirva :sonriendo:                                
Título: Orden de construcción del terreno
Publicado por: Lord Trancos en 01 de Enero de 1970, 01:00:00 AM
                                Acuerdate tambien de crearlo al iniciar DirectGraphics...

El "present parameters" que le envias a IDirect3D8.CreateDevice tiene que tener:

EnableAutoDepthStencil := true;
AutoDepthStencilFormat := D3DFMT_D16; // o bien D3DFMT_D32 para un z-buffer de 32bits

_________________
(Ignore Mode for [WhiteBlaizer] and [x-alien] is enabled.)
SaludoteZ de Lord Trancos!
www.dxlab.tk - dxlab.host.sk - programación de DirectX con Delphi.


[ Este Mensaje fue editado por: Lord Trancos el 2002-09-14 15:30 ]                                
Título: Orden de construcción del terreno
Publicado por: AgeR en 01 de Enero de 1970, 01:00:00 AM
                                Ups es cierto, olvidé esa parte.                                
Título: Orden de construcción del terreno
Publicado por: Cronodragón en 01 de Enero de 1970, 01:00:00 AM
                                De maravillas!!! Funca perfectamente! Mil gracias.

Solo para no quedarme con la duda, que es lo que hace el ZBuffer exactamente? Ordena las primitivas para que se dibujen correctamente?

- Marco                                
Título: Orden de construcción del terreno
Publicado por: BeRSeRKeR en 01 de Enero de 1970, 01:00:00 AM
                                Es un buffer donde se van almacenando las profundidades de los pixels que se van pintando. Por defecto, si la profundidad del pixel que se va a pintar es mayor que la del pixel que ya existía en esa posición del buffer pues no se pinta, de lo contrario sí que se pinta...

Saludos.
                               
Título: Orden de construcción del terreno
Publicado por: Mars Attacks en 01 de Enero de 1970, 01:00:00 AM
                                Es el buffer del eje Z (profundidad) :ojo:
Berserker se me ha adelantado :sonriendo:                                
Título: Orden de construcción del terreno
Publicado por: Cronodragón en 01 de Enero de 1970, 01:00:00 AM
                                Hmm, ya veo. Entonces debe haber un orden optimo para facilitarle el trabajo a DX?                                
Título: Orden de construcción del terreno
Publicado por: jpastor en 01 de Enero de 1970, 01:00:00 AM
                                Si no usas Zbuffer lo que tienes que hacer es dibujar primero los poligonos que esten mas lejos de la camara (creo que se llama algoritmo del pintor), pero con este metodo no se dibuja bien si dos poligonos se cortan.

Usando zbuffer no tienes que preocuparte por eso a menos que uses transparencias, que entonces antes de renderizar tendrias que ordenar caras.                                
Título: Orden de construcción del terreno
Publicado por: Mars Attacks en 01 de Enero de 1970, 01:00:00 AM
                                Al DX y a cualquier otro sistema que utilices. El Z-Buffer es una técnica de ordenamiento; no importa qué utilices para pintar los elementos en pantalla, con el algoritmo Z-Buffer (que no sólo es un buffer, también es el algoritmo que rellena ese buffer) el programa le dice a la escena qué partes serán visibles desde el punto de vista de la cámara y cuáles no.
No sé si me he explicado bien.                                
Título: Orden de construcción del terreno
Publicado por: Mars Attacks en 01 de Enero de 1970, 01:00:00 AM
                               
Citar
El 2002-09-14 22:23, jpastor escribió:
Si no usas Zbuffer lo que tienes que hacer es dibujar primero los poligonos que esten mas lejos de la camara (creo que se llama algoritmo del pintor), pero con este metodo no se dibuja bien si dos poligonos se cortan.

Hay otros algoritmos aparte del Z-buffer: El del pintor, el de trazado de rayos, el de Warnock, el de Weiler-Atherton, las líneas de barrido... pero el más usual es el z-buffer, ya que no precisa ordenación, maneja todo tipo de escenas, el tamaño que ocupa en memoria es el del tamaño de la escena, y la más importante, que actualmente todas las tarjetas gráficas lo tienen implementado por hardware.
El algoritmo es el siguiente:

Algoritmo Z-Buffer
 Inicializar imagen a color del fondo
 Inicializar zbuffer a la z de máximo alejamiento

 para cada polígono
   para cada píxel en la proyección del polígono {
     z:=z(x,y)
     si z más cercana que zbuffer(x,y) {
       zbuffer(x,y):=z
       escribir pixel (x,y) al color conveniente } }

fin Z-Buffer

Información cortesía de mis apuntes de gráfica :ojo:
Espero que te aclare un poco el asunto :sonriendo:


[ Este Mensaje fue editado por: Mars Attacks el 2002-09-14 22:35 ]                                
Título: Orden de construcción del terreno
Publicado por: Cronodragón en 01 de Enero de 1970, 01:00:00 AM
                                Perfectamente entendido, gracias :riendo:                                
Título: Orden de construcción del terreno
Publicado por: Lord Trancos en 01 de Enero de 1970, 01:00:00 AM
                               
Citar
Usando zbuffer no tienes que preocuparte por eso a menos que uses transparencias, que entonces antes de renderizar tendrias que ordenar caras.

No hace falta ordenar las caras. Para dibujar objetos transparentes basta con desactivar el backface culling y la escritura en el z-buffer.                                
Título: Orden de construcción del terreno
Publicado por: BeRSeRKeR en 01 de Enero de 1970, 01:00:00 AM
                                Hey Lord Trancos, efectivamente eso funciona si hablamos de additive blending (ONE, ONE) pero si hablamos de alpha blending (SRCALPHA, INVSRCALPHA) entonces sí que es necesaria una ordenación de atrás hacia adelante para que la mezcla se realice adecuadamente.

Por otra parte, dibujar la escena de atrás hacia adelante puede suponer una mejora en el rendimiento ya que se reduce el overdraw (dibujar más de un pixel en la misma posición del buffer en un mismo frame).

Saludos
                               
Título: Orden de construcción del terreno
Publicado por: Lord Trancos en 01 de Enero de 1970, 01:00:00 AM
                                Vaya,... no lo sabia :loco:
He hecho unas pruebecitas y la verdad es que razon no te falta ^_^;

La verdad es que deberia de empollarme un poco mas el tema del blending que creo que todavia no lo tengo bastante claro ^_^;

Citar
Por otra parte, dibujar la escena de atrás hacia adelante puede suponer una mejora en el rendimiento ya que se reduce el overdraw (dibujar más de un pixel en la misma posición del buffer en un mismo frame).  

supongo que te refieres a dibujar la escena de delante pa atras, no? :-?

Si, bueno, siempre y cuando no pierdas mas tiempo ordenando que dibujando es una mejora, claro. :ojo:

_________________
(Ignore Mode for [WhiteBlaizer] and [x-alien] is enabled.)
SaludoteZ de Lord Trancos!
www.dxlab.tk - dxlab.host.sk - programación de DirectX con Delphi.



[ Este Mensaje fue editado por: Lord Trancos el 2002-09-15 03:06 ]                                
Título: Orden de construcción del terreno
Publicado por: BeRSeRKeR en 01 de Enero de 1970, 01:00:00 AM
                                Sí, efectivamente es de adelante hacia atrás, sorry...

Saludos
                               
Título: Orden de construcción del terreno
Publicado por: NeLo en 01 de Enero de 1970, 01:00:00 AM
                                Si se dibuja la escena de delante a atrás, ¿cómo se sabe cuando se ha dibujado sobre todos los pixels?
                               
Título: Orden de construcción del terreno
Publicado por: BeRSeRKeR en 01 de Enero de 1970, 01:00:00 AM
                                Si empiezas a pintar los polígonos de adelante hacia atrás, quiere decir que (por defecto) una vez que pintes el polígono más cercano a la cámara, el resto no va a pasar el test de profundidad por lo que no se va a actualizar el ZBuffer ni tampoco se va a tener que pintar más de un pixel en la misma posición del frame buffer (overdraw)

Saludos