Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Librerias , sombreados, y por supesto dxlib32...

Iniciado por Manu343726, 30 de Marzo de 2011, 10:04:03 PM

« anterior - próximo »

Manu343726

He estado mirando post antiguos  me he dado cuenta de que la librería de directx8 tambien es necesaria,pero creo que no la subí junto con los otros dos archivos..... es obligatorio tenerla?
se que es la base de dxlib32 pero, si el sistema que lo ejecute tiene librerias de directx de una version posterior, es necesaria o puede usar la version posterior?? Digo esto sin tener n idea de los cambios de la api en los ultimos años. Teoricamente el avance de ésta deberia ser acumulativo ( por el tema de la compatibilidad) pero claro...igual quitan cosas y ponen otras....


Bueno dejemonos de rollos y vayamos al tema:

Creo que ya describí antes el método que uso para hacer el sombreado: Recorro todos los vértices del poliedro, y por cada uno creo una recta que une al vertice con el foco de luz. De éste modo el vertice de la sombra es la interseccion entre la recta vertice-foco y el plano del suelo.

Así tras recorrer todos los vertices de la figura obtengo una nube de puntos que obviamente no puedo usar directamente para pintar.
Por ello utilizo un algoritmo para obtener la envolvente de dicha nube de puntos,ésto es, el polígono convexo con menor área que contiene a todos los puntos. Y aquí está el problema. Utilizo el algoritmo de Graham (http://es.wikipedia.org/wiki/M%C3%A9todo_de_Graham) para calcularlo. Con poliedros pequeños todo va bien, pero cuando el poliedro tiene muchos vertices, los puntos de la sombra salen muy proximos entre si, y el algoritmo falla.
Alguna idea??

Otra cosa: El método que expliqué antes solo calcula las sombras proyectadas sobre el suelo, y quiero implementar tambien sombreado sobre las figuras. Alguien sabe de algun método que no sea hacer lo anterior con cada cara existente (Es decir, en vez de hacer la interseccion con el suelo, hacerla con el plano de cada cara)???


Ahora si, sobre dxlib32.  Si lo he entendido bien , el parametro z sirve para especificar la posicion en el buffer de dibujo...
He ojeado la documentacion y me parece haber visto que solo hacepta valores entre -8 y 8. Si es así, como hago para especificar la posición  de digamos 1000  texturas?

[EX3]

Cita de: VBManu en 30 de Marzo de 2011, 10:04:03 PM
He estado mirando post antiguos  me he dado cuenta de que la librería de directx8 tambien es necesaria,pero creo que no la subí junto con los otros dos archivos..... es obligatorio tenerla?
se que es la base de dxlib32 pero, si el sistema que lo ejecute tiene librerias de directx de una version posterior, es necesaria o puede usar la version posterior?? Digo esto sin tener n idea de los cambios de la api en los ultimos años. Teoricamente el avance de ésta deberia ser acumulativo ( por el tema de la compatibilidad) pero claro...igual quitan cosas y ponen otras....
Las ultimas versiones de DirectX y Windows Vista en adelante no incluyen el componente de DirectX8 para Visual Basic 6.0. La instalacion de dx_lib32 si lo hace, junto a las librerias OGG Vorbis y el componente de DirectShow e incluso el runtime de Visual Basic 6.0 por si en un futuro tambien deja de estar por defecto en el sistema como paso con la version 5.0, de ahi que siempre recomiende usar el distribuible de la web y no las librerías sueltas, comodidad y seguridad.

Cita de: VBManu en 30 de Marzo de 2011, 10:04:03 PM
Ahora si, sobre dxlib32.  Si lo he entendido bien , el parametro z sirve para especificar la posicion en el buffer de dibujo...
He ojeado la documentacion y me parece haber visto que solo hacepta valores entre -8 y 8. Si es así, como hago para especificar la posición  de digamos 1000  texturas?
Y no solo eso, si no que la coordenada Z se aplica al objeto entero y no a cada vértice, esto es, el trapezoide que compongas, aunque le indiques valores a la coordenada Z distintos a cada uno, el objeto solo usa la información de la coordenada Z del primer vértice, lo que origina lo mencionado aquí: http://www.stratos-ad.com/forums/index.php?topic=14009.msg146260#msg146260

La coordenada Z en verdad solo hace referencia a 19 capas de profundidad (8 <- 0 -> -8) que define el render de dx_lib32 ya que no uso un ZBuffer real de la gráfica por problemas que tuve con ciertos códigos que originaban artefactos al dibujar texturas con transparencias con canal alpha. Es un simple método para organizar planos superpuestos de forma rápida  (para un sistema 2D, con scroll parallax inclusive, realmente te basta con menos capas), no se concibió para representar un espacio volumetrico, de ahí que siempre haga hincapié con que la librería no esta pensada para 3D :(

La solución pasaría por armarte tu propio sistema de profundidad, una lista de llamadas (una lista con una estructura que almacene los parametros de las llamadas, que es lo que hace dx_lib32 internamente) que puedas ordenar por dicha coordenada Z para luego ejecutarlo en bloque. Asi no te limitarias en niveles de profunidad como dx_lib32 hace y podrias representar tantos niveles como necesitaras. Esto si estas en .NET es muy facil y rapido si usas listas tipadas (la coleccion de tipo List(Of T), mejor que un Array) y el metodo de extension OrderBy() de LinQ o el metodo Sort() con su predicado adecuado. En Visual Basic 6.0 directamente es un suicidio tratar de ordenar una lista asi a pelo.

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

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

Manu343726

Bueno es una pena... pero gracias por la ayuda. La verdad es que ya implementé mi propio buffer de dibujo así que no hay problema.

Bueno ya me he decidido definitivamente a pasar al poryecto a dxlib32. Mi motor redibuja mediante la llamada a una funcion publica, la cual devuelve la imagen resultante. Con lo cual sería relativamente facil hacer ésto en el bucle de dxlib32. Solo tendría que crear una textura a partir de dicha imagen y redibujarla... Pero es ésto eficiente?? Es decir, aguanta la librería que estés creando una textura desde la memoria una y otra vez???

[EX3]

Cita de: VBManu en 31 de Marzo de 2011, 04:45:33 PM
Solo tendría que crear una textura a partir de dicha imagen y redibujarla... Pero es ésto eficiente?? Es decir, aguanta la librería que estés creando una textura desde la memoria una y otra vez???
RenderTargets, pues mas o menos si son eficientes siempre y cuando no hablemos de texturas grandes (mas de 1024x1024) puedes tener una tasa de mas de 40fps pero no se para que necesitarias crear la textura, pinta la escena tal cual sobre pantalla en vez de sobre una textura, va a ser mas optimo (el que uses RenderTargets tendría sentido si quieres rotar o escalar la escena compuesta o hacer cualquier otra accion sobre la composición o representar algo estático que no va a cambiar durante la ejecución pero tengas que generarlo proceduralmente).

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.