Buenash! Pues veréis, tengo UN objeto que dibuja MUCHAS primitivas, y me es "imposible" saber en qué orden se dibujarán todas, pues depende de dónde esté la cámara, y al estar todas juntas... el precioso algoritmo del pintor peta y se ve todo fatal. He probado a trabajar con d3d_set_depth pero no funciona, aún así sería un lío calcular en qué orden debería dibujarlas
Sea como sea, quiero ver si se puede solucionar con d3d_set_zwriteenable. Quiero desactivar el zwrite sólo para ESE objeto del enemigo, para poder dibujar todas las primitivas ignorando el z buffer, pero que SÓLO afecte a ESE objeto. Desactivo d3d_set_zwriteenable al inicio, dibujo, y luego lo activo. Funciona, el problema es que también afecta a otros objetos (a otros enemigos e incluso a los suelos y paredes). Hay forma de que sólo funcione para ESE objeto? Es decir, dibujar todas las primitivas ignorando el zbuffer pero sólo ENTRE ELLAS, sí teniendo en cuenta el zbuffer de los demás objetos.
PD: Me doy cuenta que es parecido a una duda que puse hace poco que creí resuelta, aunque en ese caso el problema resultó ser otro, este es concretamente ESTE problema del zbuffer
Hola,
No creo que se pueda solucionar con d3d_set_zwriteenable ya que aunque esta función ignora el orden de pintado, dibuja igualmente uno por encima del otro, es decir que si tienes una esfera cerca y a lo lejos otra esfera puedes ver que la otra esfera se dibuja de forma pequeña sobre la esfera que esta mas cerca (siempre que el orden de dibujo sea primero la cercana y luego la lejana)
La mejor forma de solucionar ese problema es ordenando el dibujado de las instancias pero creo que para ayudarte mejor me podrías decir que tipo de geometría y textura estas intentando renderizar.
Igualmente el orden de dibujo siempre es aconsejable dibujar todas las instancias que sean opacas primero y luego las instancias con transparencia de la mas lejana a la mas cercana a la cámara.
Saludos.
Precisamente quiero que la esfera lejana pequeña se dibuje por encima de la grande cercana (o por detrás, no me importa el orden) . Bueno, realmente no quiero, pero para mi caso se ve perfectamente de ese modo y es lo único que he encontrado para resolverlo (pues como digo, no puedo saber en qué orden dibujar las primitivas para odenarlas, son demasiadas. Incluso he tratado de usar d3d_set_depth para intentar dibujas las más lejanas primero, estando seguro que EN ESE CASO estaban bien ordenadas, y no ha funcionado). El problema es que hay una pared al fondo de todo, y esa pared se dibuja por encima de ambas esferas, cuando el zwrite desactivado debería afectar a SÓLO las dos esferas (las cuales dibuja ambas un mismo objeto) y que NO afecte al muro detrás de todo. Desactivo el zwrite antes de dibujar ambas esferas (desde un mismo objeto) y lo activo después. El problema es hacer que el zwrite desactivado no afecte al muro de hay que detrás ni a ningún otro objeto, es decir, sólo a aquello que dibuja ESTE objeto, pero no lo logro :)
Ejemplo: tenemos el objeto A que dibuja dos pelotas y el objeto B que dibuja otras dos (mismo objeto, dos instancias). Las cuatro alineadas. Yo quiero que ambas esferas, para CADA objeto, se dibujen con el zwrite desactivado (viéndose las más lejanas por encima de las cercanas en algunos casos), pero que las dos del objeto B NO SE PONGAN POR ENCIMA de las dos del objeto A. Es decir, desactivar el zwrite, y dibujar sin zbuffer, para todas las primitivas de UN MISMO objeto, pero NO interfiriendo con otros objetos, es lo que no logro
y el muro lo estas dibujando antes o después de las esferas? tienes que dibujar en este caso las esferas primero y luego el muro para que de ese modo solo se vean afectados los primeros objetos y no haya nada previamente dibujado que pueda causar problemas...
EDIT: el tema es que no se puede desactivar para una instancia aislada, se desactiva en relación a lo que haya dibujado en ese momento, por lo que si tienes 4 esferas alineadas y quieres que un par no interfiera con el otro entonces vas a tener que mirar nuevamente el orden de dibujo, ya que si por decir dibujas primero las 2 cercanas y luego las 2 lejanas, así hayas desactivado y activado a tiempo, cuando vas a dibujar las 2 lejanas ellas trabajan sobre las 2 cercanas porque ya estaban dibujadas.
Vale, fue mi culpa. Yo tenía asignada a cada objeto una depth igual a la distancia a la cámara, así lo más lejano se dibuja antes, pero resulta que en la pared no estaba recalculando la depth a cada step, de ahí los fallos... lo he arreglado y ahora sí, se dibuja lo que está al fondo primero y luego las pelotas.
Supongo que, como dices, al desactivar el zwrite, se desactiva para TODO, y NO PUEDES desactivarlo de forma concreta para una sola instancia. Por lo tanto tengo que dejarlo desactivado para todo, y manualmente darle una depth a CADA objeto. Debo dibujar lo más lejano primero y lo más cercano después, así aún sin zwrite, irá bien. Y dentro del mismo objeto no me importa el orden, así que todo funciona bien ahora :D
Lección: ajustar manualmente la depth de todos los objetos acorde a su distancia a la cámara y mantener el zwrite desactivado para TODOS los objetos del juego y siempre. Doy el tema por resuelto, gracias :D