[U3D]Environment mapping problemi e soluzioni

Argomenti riguardanti il D3D di GameMaker e librerie esterne.
Jak
Admin
Messaggi: 12355
Iscritto il: 19/08/2009, 16:20
Specialità: Programmazione 3D
Uso: GM:Studio 2
Contatta:

[U3D]Environment mapping problemi e soluzioni

Messaggio da Jak »

Ho aperto questo topic per spiegare come utilizzare la tecnica environment mapping e dettagli su coem risolvere alcuni problemi riscontrati.
Questa è una tecnica implementata in U3D per fare delle ottime riflessioni del mondo esterno.
Questa tecnica non fa altro che, a partire da un punto nel mondo, fare 6 fotografie del mondo esterno, due per ogni asse cartesiano. Questa texture viene applicata ad un cubo immaginario, praticamente è come se ogni lato del cubo fosse una macchina fotografica a se stante e si desse una texture in base al mondo esterno. A quel punto noi possiamo applicare questa mappa(chiamata appunto mappa cubo) ad un qualsiasi modello. A quel punto U3D farà dei particolari calcoli in base all'inclinazione del triangolo e la posizione della telecamera per dare l'effetto riflessione. Prima di vedere il procedimento di applicazione vediamo alcuni importanti concetti. Per avere una buona mappatura è essenziale mettere la fotocamera della mappa in una buona posizione, è quindi preferibile che usiate il centro del modello.
Altra cosa molto importante è da evitare di usare un'eccessivo smooth delle normali poichè questa tecnica si basa su di esse. Se smoothate triangoli troppo inclinati tra loro potreste ottenere brutti risultati.
Ecco degli screen di esempio:
Spoiler
Immagine
Su questo screen potete vedere che il cubo non riflette bene il mondo, ciò è dovuto al fatto che le normali del cubo sono smoothate. Ciò è la prova che dovete usare lo smooth con cautela. Se vi capitano cose simili una soluzione è eliminare lo smooth dal programma di modellazione o usare la funzione RecalculateNormals().
Chiaramente anche non usare affatto lo smooth può essere un problema poiché per triangoli che praticamente sono paralleli tra loro è necessario che ci sia continuazione nella texture. Ciò potrebbe dare un'eccessivo senso di distaccamento tra i vari triangoli dando un bruttissimo effetto. Un buon smooth angle può essere un valore tra i 30° ed i 45°.
In questo screen potete vedere il cubo con le normali sistemate:
Spoiler
Immagine
Come vedete si nota un forte distaccamento tra le facce ma se ci pensate visto che le facce sono disposte a 90° tra loro, l'effetto è quello giusto. In questo esempio ho messo attorno al cubo delle pareti ed in cima il cielo. Il cerchio rosso l'ho messo per far notare che non è un bug bensì è le cima del muro, sopra infatti vi è il cielo. Se vi sembra un po strano il distaccamento per via del fatto che ho usato una bassa risoluzione della fotocamera.
Vediamo ora come si utilizza questa tecnica.
Prima di tutto create una primitiva o un modello e poi usate queste funzioni:

Codice: Seleziona tutto

CreateCubeTextureRenderTarget(id,definizione)
SetMaterialEnvironmentMap(materiale,texture)
Vediamole una per volta, CreateCubeTextureRenderTarget(id, definizione)
Questa funzione serve a far si che u3d utilizzi una data texture come una mappa cubo.
L'id è l'indice texture che verrà usato per la mappa cubo, definizione è il valore che indica la qualità in pixel della vostra texture, questa deve essere un multiplo di 2.
SetMaterialEnvironmentMap(materiale,texture)
materiale è il materiale in cui verrà usata la mappatura, texture indica l'indice texture della mappa, per questa usate il valore che avete immesso nella funzione precedente.
A questo punto il modello avrà un materiale ove sarà usata la mappatura, questa però è statica. Vi è un'altra funzione che consente di aggiornare la mappa dell'ambiente.
RenderToCubeTexture(texture,x,y,z,r,g,b,a,room1,room2...);
texture è la texture che deve venire usata per la mappatura, usate i valori delle funzioni precedenti. x,y,z questi tre argomenti indicano la posizione dove verrà collocata la fotocamera. Cercate di metterla il più possibile centrale al modello per avere un'effetto migliore.
r,g,b,a questi indicano il colore che deve essere sommato alla texture. Il valore di alfa non indica che valore di alfa avrà la texture bensì indica un valore di trasparenza con cui verranno miscelati i colori. per farvi un'esempio sul funzionamento immaginatevi un'immagine sull'editor di sprite, sopra di essa disegnate quindi un rettangolo con dei valori di r,g,b,a. Questi valori r,g,b,a fanno la stessa cosa con u3d. Se volete lasciare la texure così com'è usate quindi dei valori di 0 per tutti e quattro gli argomenti. se usate un'alfa di 255 l'immagine verrà completamente coperta dal colore e quindi non sarà visibile.
room1,room2...
indicano le room che verranno renderizzate nella mappatura. QUESTE NON SONO LE ROOM DI GM, sono delle room particolari di ultimate 3d. Se non le conoscete basta non usare questi argomenti per far si che tutto funzioni alla perfezione. Se invece sapete cosa sono potrebbe essere utile usare una room per l'oggetto che riflette il mondo e non renderizzatelo. In questo modo si possono evitare brutte riflessioni del modello stesso nel caso fosse completo. Le room danno anche la possibilità di aumentare le prestazioni.
RenderToCubeTexture(...) è molto lenta perchè renderizza 6 telecamere diverse. Usatela con cautela magari non in tutti gli step!
Ultima modifica di Jak il 08/07/2010, 15:16, modificato 3 volte in totale.
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
maz85
Admin
Messaggi: 8287
Iscritto il: 07/02/2004, 15:57
Specialità: Nientologo
Località: Oblio
Contatta:

Re: [U3D]Environment mapping problemi e soluzioni

Messaggio da maz85 »

Potevi usare un po' di formattazione

Immagine

:lol:

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

Re: [U3D]Environment mapping problemi e soluzioni

Messaggio da Jak »

maz85 ha scritto:Potevi usare un po' di formattazione
Spoiler
Immagine
:lol:
Bè, una tipa che si diceva da sola ciao jak volevo evitare di metterla! :lol:
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
fra3point
Membro attivo
Messaggi: 388
Iscritto il: 24/08/2010, 15:16
Specialità: Prog. e 3D Modelling
Località: L'Aquila
Contatta:

Re: [U3D]Environment mapping problemi e soluzioni

Messaggio da fra3point »

Ri-posto qui un quesito che avevo già postato in un altro topic.

Ebbene io ho nell'evento create del mio oggetto

Codice: Seleziona tutto

CreateCubeTextureRenderTarget(900,16);

SetMaterialEnvironmentMap(GetMaterialIndex("material_piedistallo",900));
Inoltre (se ho capito bene) dovrei aggiornare la texture del "mondo esterno". L'ho fatto ogni 5 step:

Codice: Seleziona tutto

RenderToCubeTexture(900,x,y,z,0,0,0,180);

Soltanto che come ha detto jak nel post relativo è molto lenta come funzione (e mi rallenta tutto il gioco) e non compare nessun effetto di riflesso. :?
draw_text(100,100,"fra3point");

Progetti in corso:
Spoiler
Tuning Paradise --> 10%

Saw: The Game --> 60%

Tropic Races --> 40%

Avatar utente
maz85
Admin
Messaggi: 8287
Iscritto il: 07/02/2004, 15:57
Specialità: Nientologo
Località: Oblio
Contatta:

Re: [U3D]Environment mapping problemi e soluzioni

Messaggio da maz85 »

Se è molto lenta c'è qualcosa che non va...

Codice: Seleziona tutto

SetMaterialEnvironmentMap(GetMaterialIndex("material_piedistallo",900));
semmai è così:

Codice: Seleziona tutto

SetMaterialEnvironmentMap(GetMaterialIndex("material_piedistallo"),900);

Avatar utente
fra3point
Membro attivo
Messaggi: 388
Iscritto il: 24/08/2010, 15:16
Specialità: Prog. e 3D Modelling
Località: L'Aquila
Contatta:

Re: [U3D]Environment mapping problemi e soluzioni

Messaggio da fra3point »

Ho corretto la parentesi e ora sto facendo qualche prova, ma non riesco davvero per niente a trovare la soluzione. Innanzitutto non riesco a far riflettere quello che vorrei, cioè pare che rifletta altre cose (forse devo settare meglio le coordinate?).
Inoltre anche se uso questo metodo su modelli lowpoly e non in tutti gli step continuo ad avere rallentamenti allucinanti.... :|
draw_text(100,100,"fra3point");

Progetti in corso:
Spoiler
Tuning Paradise --> 10%

Saw: The Game --> 60%

Tropic Races --> 40%

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

Re: [U3D]Environment mapping problemi e soluzioni

Messaggio da Jak »

allora, noto che hai messo 16 come risoluzione quindi una texture 16x16... Questa fa alquanto pietà, metti un valore con cui la texture sia riconoscibile tipo 256.
Il fatto che è lenta invece è un po strano visto che hai messo una risoluzione di 16 appunto. :fapensare:
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
maz85
Admin
Messaggi: 8287
Iscritto il: 07/02/2004, 15:57
Specialità: Nientologo
Località: Oblio
Contatta:

Re: [U3D]Environment mapping problemi e soluzioni

Messaggio da maz85 »

Lo ho usato su Vortal e non ho notato particolari problemi o lentezza, comunque fixa le coordinate e aggiorna almeno ogni 30 step (ma non penso sia questo il problema della lentezza).

Avatar utente
fra3point
Membro attivo
Messaggi: 388
Iscritto il: 24/08/2010, 15:16
Specialità: Prog. e 3D Modelling
Località: L'Aquila
Contatta:

Re: [U3D]Environment mapping problemi e soluzioni

Messaggio da fra3point »

Si già avevo impostato l'aggiornamento ogni 30 step, e puntualmente, ogni pochissimo, c'è quel bruttissimo scatto! Ho una scheda da 1GB, non credo che sia quella! :|

EDIT: @jak -- ho provato tutti i possibili valori delle potenze del 2. E ogni volta mi esce qualcosa di diverso! :furiosomedio:
Ora sto cercando di leggere qualche post nel sito di U3D ma senza alcun riscontro pratico finora...
draw_text(100,100,"fra3point");

Progetti in corso:
Spoiler
Tuning Paradise --> 10%

Saw: The Game --> 60%

Tropic Races --> 40%

Avatar utente
maz85
Admin
Messaggi: 8287
Iscritto il: 07/02/2004, 15:57
Specialità: Nientologo
Località: Oblio
Contatta:

Re: [U3D]Environment mapping problemi e soluzioni

Messaggio da maz85 »

Questo è quello che ho su Vortal (l'ho riscritto e diviso per farti chiarezza) ed è su un MODELLO, non su un primitivo:

Su Create:

Codice: Seleziona tutto

// CreateCubeTextureRenderTarget(Index,RequestedEdgeLength)
CreateCubeTextureRenderTarget(512,256);
texture=512;
// SetMaterialEnvironmentMap(MaterialIndex,TextureIndex)
SetMaterialEnvironmentMap(0,512);
SetModelMaterial(0,0,0,0,220);

Su Step:

Codice: Seleziona tutto

//RenderToCubeTexture(CubeTextureIndex,CameraPositionX,CameraPositionY,CameraPositionZ,ColorR,ColorG,ColorB,ColorA,RoomIndex1,RoomIndex2,...,RoomIndex8)
RenderToCubeTexture(512,x,y,z+10,0,0,0,32,0);
Spoiler
Immagine

Avatar utente
fra3point
Membro attivo
Messaggi: 388
Iscritto il: 24/08/2010, 15:16
Specialità: Prog. e 3D Modelling
Località: L'Aquila
Contatta:

Re: [U3D]Environment mapping problemi e soluzioni

Messaggio da fra3point »

Forse ho capito cos'è che fa rallentare il gioco... Dunque, l'oggetto principale è un'automobile, che contiene circa 25.000 poligoni. Quando un oggetto deve riflettere il mondo esterno, se l'auto è presente nella scena viene rallentato tutto. Se invece (come ho provato ora) tolgo la macchina il gioco è più fluido. A questo punto dovrei usare dei modelli lowpoly, che non superino i 10.000 triangoli. Il che mi mette davanti a scelte un po' rognose. Vabbè mi adeguerò.. :amen:

Invece non riesco a capire come devo settare le coordinate del render su mappa cubica. Cioè, io vedo qualche riflesso, ma non è quello che vorrei... In questa immagine è evidenziato il riflesso che ottengo, mentre vorrei che venisse riflessa l'automobile.

Immagine
draw_text(100,100,"fra3point");

Progetti in corso:
Spoiler
Tuning Paradise --> 10%

Saw: The Game --> 60%

Tropic Races --> 40%

Avatar utente
CaMpIoN
Membro super
Messaggi: 684
Iscritto il: 17/11/2009, 16:20
Specialità: Programmatore
Uso: GM:Studio 1.4 Master
Contatta:

Re: [U3D]Environment mapping problemi e soluzioni

Messaggio da CaMpIoN »

maz85 ha scritto:Potevi usare un po' di formattazione

Immagine

:lol:
Ma è fatto con GM? :shock:
Domanda: il miglior processo che ce fin'ora quant'è potente?
Quanti poligoni riesce a reggere?
Giochi da me creati:
Spoiler
Immagine

Avatar utente
maz85
Admin
Messaggi: 8287
Iscritto il: 07/02/2004, 15:57
Specialità: Nientologo
Località: Oblio
Contatta:

Re: [U3D]Environment mapping problemi e soluzioni

Messaggio da maz85 »

Una cubica andrebbe applicata all'auto, al piedistallo andrebbe bene una piatta o no?
Comunque non è che le coordinate texture del piedistallo sono sballate? Perchè sembra che rifletta solo un particolare dell'auto.

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

Re: [U3D]Environment mapping problemi e soluzioni

Messaggio da Jak »

Con la cubica non vengono considerate le coordinate texture, si usano solo le normali(quindi prova ad usare RecalculateNormals() ).
Per risolvere il problema low poly basta mettere fuori dallo schermo una macchina low poly e fare il rendering di quella, applicandolo alla piattaforma corretta avrai la velocità.

Il tuo problema comunque sembra un problema di coordinate del punto di render. Con la texture cubica è utile come dice maz per fare il riflesso sulla macchina ma nel tuo caso se la metti sotto la macchina non avrai mai un buon risultato. Il riflesso è ciò che vedi da un punto preciso.

Se vuoi avere un buon risultato sul piano l'unica tua speranza è quella di usare gli shader.
Vai sul topic della collezione di shader(a proposito, devo aggiungerne un bel po) e usa quello dell'acqua per il riflesso, togli la parte dedicata alla rifrazione e gioca con i valori per avere una superfice completamente piatta.
Ora provo a giocarci anche io con i valori così magari riesco a trovarti il sistema perfetto.

EDIT: che idiota. Basta che metti la camera non sotto la macchina ma tra la macchia e la camera(sempre con una z più bassa della macchina)
Anche perchè lo shader dell'acqua usa le cubemap. L'unica cosa che fa è distorcere l'acqua.
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
fra3point
Membro attivo
Messaggi: 388
Iscritto il: 24/08/2010, 15:16
Specialità: Prog. e 3D Modelling
Località: L'Aquila
Contatta:

Re: [U3D]Environment mapping problemi e soluzioni

Messaggio da fra3point »

da tre giorni sto impazzendo.. :furioso: ho provato con lo shader dell'acqua.. solo che riflette cose che non sono quelle che vorrei.. Invece con la cube map gestire un riflesso per bene è abbastanza complesso..
Ora, tralasciando il fattore lentezza sono quasi riuscito ad ottenere un buon (magaari!) riflesso..
Ho seguito il consiglio di Jak: ho posizionato il punto di vista della telecamera della cube map tra la mia telecamera e l'auto. In effetti il riflesso c'è ed è anche riconoscibile (qualità 512). Ma c'è ancora qualcosa che non va..

ecco uno screen:

Immagine
draw_text(100,100,"fra3point");

Progetti in corso:
Spoiler
Tuning Paradise --> 10%

Saw: The Game --> 60%

Tropic Races --> 40%

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

Re: [U3D]Environment mapping problemi e soluzioni

Messaggio da Jak »

Il problema è che è spostato giusto?
Molto semplice la soluzione, lo shader usa una texture che la usa come mappa di distorsione, immagino che tu l'hai resa monocromatica per dare l'effetto piatto ma ricordati che è una distorsion map quindi mettendo ad esempio tutto bianco ti viene giusta ma spostata, lo stesso per il nero. La soluzione è che la distorsion map sia completamente grigia (r,g,b=128) e sarà perfetta :D
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
fra3point
Membro attivo
Messaggi: 388
Iscritto il: 24/08/2010, 15:16
Specialità: Prog. e 3D Modelling
Località: L'Aquila
Contatta:

Re: [U3D]Environment mapping problemi e soluzioni

Messaggio da fra3point »

no questo screenshot non deriva dallo shader. Questo è con la cube map!.. Con lo shader non viene riflessa nessuna immagine.. anche se tolgo l'auto il riflesso è sempre lo stesso..

Questo invece è lo screen che mi esce con lo shader:
Spoiler
Immagine
draw_text(100,100,"fra3point");

Progetti in corso:
Spoiler
Tuning Paradise --> 10%

Saw: The Game --> 60%

Tropic Races --> 40%

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

Re: [U3D]Environment mapping problemi e soluzioni

Messaggio da Jak »

e se anzichè il riflesso facessi semplicemente un'altra macchina sotto di essa specchiata e con alfa a che so 0.3?
La parte sopra della piattaforma ovviamente la togli.
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
fra3point
Membro attivo
Messaggi: 388
Iscritto il: 24/08/2010, 15:16
Specialità: Prog. e 3D Modelling
Località: L'Aquila
Contatta:

Re: [U3D]Environment mapping problemi e soluzioni

Messaggio da fra3point »

non credo che sia possibile.. la macchina da specchiare è dinamica, cioè può essere cambiata in ogni momento.. Quindi la soluzione più vicina a quello che dici tu sarebbe di fare tutto in doppio.. e in teoria è possibile.. Ma ion pratica non lo è perché i modelli che utilizzo per il gioco non sono low-poly.. a volte già mi si rallenta così il gioco, figuriamoci con il doppio di triangoli da elaborare! ;)
draw_text(100,100,"fra3point");

Progetti in corso:
Spoiler
Tuning Paradise --> 10%

Saw: The Game --> 60%

Tropic Races --> 40%

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

Re: [U3D]Environment mapping problemi e soluzioni

Messaggio da Jak »

fai un modello low poly della macchina, con milkshape puoi usare il motore LOD delle directx per diminuire il numero di triangoli di un modello. Per il fatto di copiare il codice sul secondo oggetto considerando che sei 3 gionri che vai avanti non dovrebbe essere un problema.
Comunque se quella macchina ti rallenta quasi gnon oso immaginarmi quando ce ne saranno altre e tutta l'ambientazione :hum:
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

Rispondi

Chi c’è in linea

Visitano il forum: Nessuno e 27 ospiti