PDA

View Full Version : Normal Map in PS 2.0


Fumereo
13-01-2007, 16:48
Salve a tutti, volevo il parere di qualche mente piu' esperta nella programmazione dei pixel shader su un problema che sto cercando di affrontare diversi modi...

Lo scopo e' quello di dividere una nmap in piu' zone e poter gestire separatamente le intensita' di queste zone.

In pratica attraverso dei pesi (semplici valori float) sono in grado di aumentare o diminuire l'intensita' di applicazione della nmap in zone diverse.

Quindi se ho la nmap di un volto di una persona potro' decidere di agire indipendentemente sulle rughe della fronte piuttosto che su quelle del sopracciglio destro e via cosi'.

La divisione delle zone si gestisce attraverso l'alpha channel: In pratica la nmap e' una TGA 32bit. Il texture artist puo' disegnare diverse zone sul canale alpha e dotarle di una diversa opacità. A seconda del valore che ha l'alpha posso decidere nel pixel shader se applicare o no il bump in quel punto e di quanto.

Le limitazioni a questa tecnica sono il numero di zone gestibili. Io ho una 9800pro e posso gestire al massimo 64 operazioni aritmetiche nel ps.
Utilizzando dei banalissimi (ma piuttosto onerosi) IF ELSE per decidere se applicare o no la nmap in quel punto riesco al massimo a gestire 6 zone diverse.

Qualcuno magari si mettera' le mani nei capelli ma e' il primo ps che scrivo e non sono molto avvezzo di programmazione. Qualcuno per caso ha un idea migliore su come realizzare cio' che voglio?

a proposito: sto utilizzando linguaggio HLSL su rendermonkey

Fumereo
14-01-2007, 11:49
:mc:

Ufo13
14-01-2007, 14:38
Hmmm quindi tu vuoi che quando l'alpha vale 0 la trasformazione in texture space non venga eseguita?

Fumereo
14-01-2007, 18:03
nono!!

L'alpha lo uso solo per "disegnare" diverse zone sulla nmap.
Se l'alfa in una zona e' 0 potro' decidere se attivarci sopra il bump oppure no e di quanto.

Potendo al massimo gestire 6 "zone" ho separato i valori di alpha a 0, 20, 40, 60, 80 e 100 % di opacita'.

Con queste indicazioni il texture artist puo' decidere quali zone vanno processate con lo stesso valore di bump.

Se non e' ancora chiaro ditemi che provo a inserire delle immagini

Ufo13
14-01-2007, 18:28
beh si posta va :D

Fumereo
14-01-2007, 19:01
:D

Allora...qua ho separato in due immagini il canale rgb e il canale alpha della normal map
Questo e' il canale RGB: http://img53.imageshack.us/img53/7594/normalhk0.jpg (http://imageshack.us)
Questo e' il canale alpha:http://img232.imageshack.us/img232/4637/alphakp9.jpg (http://imageshack.us)

Scusa la formattazione orrenda del post...

Comunque come puoi notare su ogni oggettino idiota (e' solo una mappa di test) che deve risaltare c'e' un diverso grado di opacita'.

Per esempio il "cono tronco" e' coperto da grado di opacita' 60%

In questo modo io che ho 6 comodissimi slider posso decidere di aumentare il bump del solo cono in questa maniera (il cubo ha di default una bump di un muro....in piu' come vedi appare il cono tronco)

http://img62.imageshack.us/img62/4743/screenxd0.jpg (http://imageshack.us)

Ufo13
15-01-2007, 23:24
Non capisco niente di quello che stai facendo

Non capisco il nesso tra zone e alpha channel.

Potendo al massimo gestire 6 "zone" ho separato i valori di alpha a 0, 20, 40, 60, 80 e 100 % di opacita'.


Ma tu non vuoi semplicemente dire quanto thick è la normal in quel punto? Non ti basta usare una bump map?

Ufo13
15-01-2007, 23:27
ah, FORSE ho capito, comunque tu riposta la spiegazione in modalità "scuola elementare" per favore :)

Fumereo
16-01-2007, 15:37
okok...intanto grazie per l'interessamento :D

Immaginiamo di avere una superficie piatta alla quale applichiamo una normal map.

Su questa normal map abbiamo disegnato un rombo e un quadrato. distanti tra di loro (non sovrapposti).

Ora nel piu' classico degli shaders che gestisce una normal map io posso aumentare un peso per variare il grado di rilievo con il quale queste due figure appariranno sulla superficie piatta. se il valore e' 0 non c'e' rilievo se il valore e' 1 il rilievo e' massimo. (semplifichiamo per comodita' d'esempio)

Nel mio shader e' possibile invece usare due pesi. Con uno gestisco il rombo, con l'altro il quadrato. Quindi posso far apparire il rombo sulla superficie e non il quadrato e viceversa o tutti e due con pesi indipendenti tra loro.

Ripeto che il quadrato e il rombo sono sulla stessa normal map. Quindi lo shader deve poter dividere la normal map per agire in maniera diversa a seconda della "zona". La maniera, poco efficiente, che ho sviluppato per adesso e' disegnare sull'alpha channel diversi gradi di opacita'.

In corrispondenza del rombo l'opacita' e' 0% (trasparente) mentre in corrispondenza del quadrato l'opacita' e' del 100%.

Lo shader leggera' il valore dell'alpha.... (if mappa.alpha == 0) USA il pesoA, altrimenti usa il pesoB.

PesoA e pesoB sono i valori con cui decido se e di quanto bumpare.

E' vagamente piu' chiaro? :fagiano:

CICUS
16-01-2007, 16:59
scusa se mi intrometto...sono un programmatore ma non grafico :D :D

ma stai usando del codice c#?

Fumereo
16-01-2007, 18:41
:D Sto usando hlsl che e' molto simile al C

CICUS
16-01-2007, 19:37
mi era venuto in mente c# siccome anche li si possono usare le librerie directx :)

Ufo13
16-01-2007, 19:37
usare più texture è improponibile? Io terrei ogni shape in una texture diversa onestamente...

Fumereo
16-01-2007, 19:43
mi era venuto in mente c# siccome anche li si possono usare le librerie directx :)

Si ma qua non sto usando librerie directX. Sto creando un piccolo programma che gira proprio sulla scheda video (shader). La scelta quindi e' o l'assembler o un linguaggio proprietario di nvidia (Cg) o Hlsl oppure Glsl(opensource)...e chi ne sa di piu' mi corregga se sbaglio :fagiano:

Fumereo
16-01-2007, 19:51
usare più texture è improponibile? Io terrei ogni shape in una texture diversa onestamente...

Diventa improponibile ai fini di quello che sto cercando di realizzare.... :D

Le applicazioni in seguito sarebbero molteplici....per esempio usando una stress map come "texture dei pesi" potrei andare a definire in tempo reale il bump di un modello in un determinato punto.

Ad esempio portando questo shader in maya potrei fare in modo di ottenere la variazione dinamica di bump in relazione alla distensione o alla contrazione poligonale del modello. Quindi se il mio modello strizza l'occhio appaiono delle rughe in corrispondenza delle zampe di gallina :sofico: .....

Insomma potrebbero esserci degli sviluppi interessanti......

Ufo13
16-01-2007, 20:06
Anche questa è una cosa che può benissimo essere fatta con qualche texture in più secondo me... Ogni texture ha associata una costante che dice la "profondità". Onestamente però non conosco il prezzo di un texture fetch rispetto a un IF-ELSe.. Io credo sia minore ma vedi tu.

IF e ELSE sarebbe meglio non usarli ma dipende sempre da cosa ti serve. Comunque ora sto un po' scoppiato, magari quando mi riprendo vedo di pensare a un'altra soluzione :D