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
Significa que no tienes el ZBuffer establecido, o que no lo borras al hacer un Clear.
Creo que más bien podría ser lo del ZBuffer, cómo puedo cambiarlo?
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:
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 ]
Ups es cierto, olvidé esa parte.
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
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.
Es el buffer del eje Z (profundidad) :ojo:
Berserker se me ha adelantado :sonriendo:
Hmm, ya veo. Entonces debe haber un orden optimo para facilitarle el trabajo a DX?
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.
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.
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 ]
Perfectamente entendido, gracias :riendo:
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.
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
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 ]
Sí, efectivamente es de adelante hacia atrás, sorry...
Saludos
Si se dibuja la escena de delante a atrás, ¿cómo se sabe cuando se ha dibujado sobre todos los pixels?
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