|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Nov 2002
Città: Ivrea-Milano
Messaggi: 381
|
Normal Map in PS 2.0
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 |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Nov 2002
Città: Ivrea-Milano
Messaggi: 381
|
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 1545
|
Hmmm quindi tu vuoi che quando l'alpha vale 0 la trasformazione in texture space non venga eseguita?
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Nov 2002
Città: Ivrea-Milano
Messaggi: 381
|
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 |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 1545
|
beh si posta va
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Nov 2002
Città: Ivrea-Milano
Messaggi: 381
|
Allora...qua ho separato in due immagini il canale rgb e il canale alpha della normal map Questo e' il canale RGB: ![]() Questo e' il canale alpha: ![]() 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)
|
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 1545
|
Non capisco niente di quello che stai facendo
Non capisco il nesso tra zone e alpha channel. Quote:
|
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 1545
|
ah, FORSE ho capito, comunque tu riposta la spiegazione in modalità "scuola elementare" per favore
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Nov 2002
Città: Ivrea-Milano
Messaggi: 381
|
okok...intanto grazie per l'interessamento
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?
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: May 2004
Città: Torino
Messaggi: 1715
|
scusa se mi intrometto...sono un programmatore ma non grafico
ma stai usando del codice c#? |
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Nov 2002
Città: Ivrea-Milano
Messaggi: 381
|
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: May 2004
Città: Torino
Messaggi: 1715
|
mi era venuto in mente c# siccome anche li si possono usare le librerie directx
|
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 1545
|
usare più texture è improponibile? Io terrei ogni shape in una texture diversa onestamente...
|
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Nov 2002
Città: Ivrea-Milano
Messaggi: 381
|
Quote:
|
|
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: Nov 2002
Città: Ivrea-Milano
Messaggi: 381
|
Quote:
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 Insomma potrebbero esserci degli sviluppi interessanti...... |
|
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 1545
|
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 |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 12:47.






















