Problema texture alphate d3d

Argomenti riguardanti il D3D di GameMaker e librerie esterne.
Rispondi
Avatar utente
Lord Of Destruction
Membro d'elite
Messaggi: 1161
Iscritto il: 02/06/2009, 11:48
Specialità: Grafico-Progammatore
Località: Vault 101
Contatta:

Problema texture alphate d3d

Messaggio da Lord Of Destruction »

Stavo provando un po' di d3d per un nuovo progetto, e m'è sorto subito un bug strano :fapensare:
Volevo provare uno stress test con gm8 e gm81 (stesso codice) per vedere il guadagno di velocità.

test:
662 istance con diversi calcoli in step, room_speed=150, 2 draw ad ogni istanza (uno per il wall del player e l'altro per il floor dell'ombra).

Gm8: Perde un bel po' di fps, ma le ombre sono tutte disegnate bene.
Spoiler
Immagine
Gm81: Resta fisso sui 150, ma le ombre hanno uno sfarfallio
Spoiler
Immagine
Perchè in gm81 fanno così? C'entra qualcosa col fatto che vada più veloce?

Avatar utente
Fake
Membro
Messaggi: 82
Iscritto il: 05/09/2012, 20:24
Specialità: Nulla
Contatta:

Re: Problema texture alphate d3d

Messaggio da Fake »

credo che c'entra il d3d_set_hidden, mettilo su false subito prima di disegnare l'ombra e poi rimettilo su true subito dopo averla disegnata

Jak
Admin
Messaggi: 12355
Iscritto il: 19/08/2009, 16:20
Specialità: Programmazione 3D
Uso: GM:Studio 2
Contatta:

Re: Problema texture alphate d3d

Messaggio da Jak »

E' sicuramente un problema di zbuffer. Su gm8.1 l'hanno reso più preciso ma... dovrebbe accadere il contrario, cioè che su gm8.0 sfarfalla e su gm8.1 no :fapensare:
L'alfa non centra nulla, è proprio un problema di conflitto di depth.

Dall'immagine non si capisce proprio benissimo l'effetto sfarfallio quindi vado a tasto.
Prova ad aumentare l'altezza delle ombre.

Guardando bene l'immagine mi viene da dire che le ombre fanno conflitto di depth sulle altre, la soluzione è quindi quella di dare un'altezza diversa(usi la coordinata Z per l'altezza?) ad ogni ombra, una soluzione banale ma efficacie e veloce e sopratutto che non ti fa fare alcun tipo di calcolo preventivo è sicuramente quella di una formula matematica che fa un'effetto onda(usando seno e coseno) nella quale ogni onda è grande quanto lo sprite(così alla stessa Z troviamo solo ombre sufficientemente distanti tra loro).

Un calcolo buttato la da testare è:

Codice: Seleziona tutto

var difference;
difference = cos(degtorad((x/360)/sprite_width))*cos(degtorad((y/360)/sprite_height));
z = difference * tot;
tot è un valore che decidi te, dovrà essere il più piccolo possibile ma se esageri ti ritorneranno quegli artefatti.

Una possibilità è che ora, a differenza di gm8.0(credo, magari lo è pure la) il depth buffer sfrutta i floating point quindi perde di qualità con numeri molto elevati. Una distanza massima dalla camera troppo vicina o troppo lontana potrebbe portare a quel problema(così come per la distanza minima), quindi vedi di aggiustare sempre la proiezione delimitando alla perfezione distanza max e min in base alle tue esigenze.

EDIT: Fake suggerisce di togliere l'hidden, io suggerisco piuttosto lo zwrite che in effetti è una soluzione piuttosto semplice. Il depth test è molto importante e non lo toglierei per una cosa simile ma solo quando se ne ha la stretta necessità.
Togliere lo zwrite elimina completamente i conflitti tra le ombre stesse pur facendo verifica di depth ma potrebbero comunque esserci artefatti se hanno la stessa altezza di altri elementi dello scenario tipo il pavimento.
Time to feel, time to believe
Dare to see what may come of our future
Lift your head, broaden your gaze
Speak your mind and your thoughts they will follow you

Avatar utente
Lord Of Destruction
Membro d'elite
Messaggi: 1161
Iscritto il: 02/06/2009, 11:48
Specialità: Grafico-Progammatore
Località: Vault 101
Contatta:

Re: Problema texture alphate d3d

Messaggio da Lord Of Destruction »

Non funzia il tuo calcolo, jak, ma la logica del "a diverse coordinate diverse altezze sfruttando coseno e seno" l'ho provata ma vedere (anche se pochissimo) un movimento sinusoide dell'ombra mentre si cammina, non è granché..
Credo proprio che userò gm8 :fapensare:

Jak
Admin
Messaggi: 12355
Iscritto il: 19/08/2009, 16:20
Specialità: Programmazione 3D
Uso: GM:Studio 2
Contatta:

Re: Problema texture alphate d3d

Messaggio da Jak »

E togliere lo zwrite e aumentare un po l'altezza dell'ombra hai provato?
Time to feel, time to believe
Dare to see what may come of our future
Lift your head, broaden your gaze
Speak your mind and your thoughts they will follow you

Avatar utente
Lord Of Destruction
Membro d'elite
Messaggi: 1161
Iscritto il: 02/06/2009, 11:48
Specialità: Grafico-Progammatore
Località: Vault 101
Contatta:

Re: Problema texture alphate d3d

Messaggio da Lord Of Destruction »

Jak ha scritto:E togliere lo zwrite e aumentare un po l'altezza dell'ombra hai provato?
Oddio funziona alla grande! Basta settarlo false, disegnare l'ombra, e risettarlo true!
Prima non capivo cosa fosse sto zwrite, poiché non compare nel manuale, ma con l'autocompletamento del codice ho trovato la funzione d3d_set_zwriteenable :lol:

Jak
Admin
Messaggi: 12355
Iscritto il: 19/08/2009, 16:20
Specialità: Programmazione 3D
Uso: GM:Studio 2
Contatta:

Re: Problema texture alphate d3d

Messaggio da Jak »

Si è una mancanza del manuale che però era presente nell'elenco di update di versione(quando era ancora in sviluppo) grazie ai quali ho scoperto quella bellissima funzione, stupido abbandono della yoyogames :furioso:
Praticamente se due oggetti hanno la stessa z(rispetto allo schermo ma chiaramente se hai due piani paralleli che si sovrastano allora hai la stessa z rispetto allo schermo) viene fuori quello sfarfallio.
E' una ottimizzazione del draw, usa una mappa di profondità per vedere se il pixel da disegnare sta dietro ad un triangolo già disegnato ed in caso non lo disegna. Nonchè è la vera cosa che differenzia il 3d dal 2d, avere gli oggetti nascosti.
Eliminando lo zwrite per le ombre tu hai la depth map per tutti gli oggetti presenti in scena, tranne per le ombre(che tanto non serve) quindi le ombre verranno nascoste da altri triangoli ma non ne nasconderanno nessuno quindi nemmeno le altre ombre.
Spero che riesci a capire quello che ho scritto visto che l'ho spiegato malissimo :paura:
Time to feel, time to believe
Dare to see what may come of our future
Lift your head, broaden your gaze
Speak your mind and your thoughts they will follow you

Avatar utente
Lord Of Destruction
Membro d'elite
Messaggi: 1161
Iscritto il: 02/06/2009, 11:48
Specialità: Grafico-Progammatore
Località: Vault 101
Contatta:

Re: Problema texture alphate d3d

Messaggio da Lord Of Destruction »

Diciamo che sono estremamente vicino all'averlo compreso :fapensare:

Rispondi

Chi c’è in linea

Visitano il forum: Nessuno e 39 ospiti