#1 11.04.2012 21:40:55

DerPeer
GodlikeMember
Ort: Berlin
Registriert: 04.02.2005
Beiträge: 1291

Normalenmap als Volumentextur

Ich will einige Objekte rendern, die sich stark deformieren können - stellt Euch einen virtuellen Steinmetz vor der einen Stein stückchenweise in Form bringt.
Deshalb will ich die Textur der Objekte als Volumentextur definieren, das erleichtert doch vieles enorm. Die Texturkoordinaten entsprechen dann den Raumkoordinaten.

Auch eine Normalenmap soll auf den Stein gelegt werden, welche dann natürlich ebenso eine Volumentextur ist. Damit meine ich eine relative Normalenmap, also eine, deren Normalen noch durch die Vertexnormale gedreht werden müssen (und natürlich nochmals durch die Weltmatrix, aber das ist ja in der Vertexnormalen dann schon drin).

Das kostet enormen Speicherplatz. Zum Beispiel für 256x256x256x3x32Bit sind das schon 192MB, was natürlich viel zu viel ist.
Bei 128x128x128 und 2 Bytes statt 3 Singles landen wir bei 4MB, was völlig in Ordnung ist. Habt ihr da kluge Anmerkungen? Ich hätte eigentlich gern 256er, aber das kann ich mir wohl trotzdem abschminken.

Desweiteren habe ich schon Knoten im Kopf wegens der Definition einer VolumenNormalenMap.
Erste Möglichkeit: Ich definiere mit eine 3D-Bumpmap (eine Dichtemap sozusagen), und generiere daraus die Normalenmap, indem ich die Ableitungen der Dichte in den drei Richtungen bestimme - also quasi einen Dichtegradienten. Ich weiß bloß nicht, ob ich diese DichteGradientenMap überhaupt brauche/will.

Zweite Möglichkeit: Wie gehabt einfach stur die Normalen in die 3D-Map schreiben (wie auch immer jetzt generiert), wobei sowas wie (0,0,1) bedeutet, dass die Normale mit der Vertexnormale übereinstimmt.

Naja, irgendwie nich so einfach.

DerPeer

Offline

 

#2 11.04.2012 22:31:54

Gnietschow
ProMember
Ort: Berlin
Registriert: 20.06.2007
Beiträge: 237

Re: Normalenmap als Volumentextur

Angenommen du nimmst 256x256x256x24Bit wären das nur 50MB, keine Ahnung wie viele solche Texturen du brauchst, aber Grafikspeicher ist ja >512MB Standard da dürfte das auch gehen. Was würdest denn du in den 2 Bytes speichern, für Farben bräuchtest du doch mindestens 3 Byte, es sei denn du nimmst eine Extra 2D-Textur als Farbpalette und speicherst nur Indizes.

Mit dem Dichtegradienten wirst du nicht glücklich werden denke ich. Stell mir halt vor das ein dichter Punkt knapp über der Oberfläche ist, dann wären die Normalen ja verkehrt. Mit ein bisschen rumtunen wirst du damit wahrscheinlich eine Normalmap draufbekommen, aber es wird sehr aufwändig werden sie auch so aussehen zu lassen wie du es möchtest. Vor allem eine raue Steinoberfläche als Dichtemap zu generieren, stell ich mir schon etwas unmöglich vor wink

Allgemein seh ich das Problem in der Erzeugung von vernünftigen Volumentexturen. Vor allem wenn die Texturauflösung deiner Objekte nicht völlig matschig werden soll (selbst 256x256 wär da sehr gering), wirst du damit wahrscheinlich nicht gut hinkommen.

Daher mal zwei alternative Vorschläge:
1. Du machst dir mittels Textursynthese künstilche Texturen die du drauf klebst (Stichwort http://mgarland.org/files/papers/jumpmap_egsr2003.pdf, habs nur mal überflogen, aber fand recht interessant)
Damit könntest du sowohl Diffuse und Normalmaps einfach draufziehen. Weiß nur nicht ob die Algorithmen dafür zu langsam sind.

2. Du versuchst dich an prozeduralen Texturen, dann brauchst du keinen Speicherplatz und hast quasi unendlich schärfe (natürlich nur bedingt nutzbar, vll kannst du ja dein Programm mit Comiclook ausstatten, wenn es das zulässt smile )

MfGnietschow


Es gibt 10 Gruppen von Menschen - die die das Binärsystem verstehen und die anderen.  :-)
Vegetarier essen meinem Essen das Essen weg ;)
-------------------------------------------------------------------------------------------------------------------
Der Community-Hub für Videospiele: gameloop.io

Offline

 

#3 12.04.2012 10:31:24

DerPeer
GodlikeMember
Ort: Berlin
Registriert: 04.02.2005
Beiträge: 1291

Re: Normalenmap als Volumentextur

50 MB für eine Textur ist okay, meinst du? Ich frage mich halt, ob das das Rendern auch verlangsamt, weil die Daten weit auseinanderliegen -> cacheunfreundlich?

Also gut: es sind in Wahrheit Asteroiden, die man zerschießen kann :-)
Deshalb kann man zunächst von Farben absehen, Graustufen reichen. Die kann ich ja nachträglich per Palette noch einfärben.

Für Diffuse-Color-Maps gilt daher:
128x128x128x8Bit = 2MB
256x256x256x8Bit = 16MB

Was nimmt man für Bumpmaps eigentlich? Single ist wohl nicht nötig, 8Bit-Ganzzahl werden reichen. Oder gibts auch ein 4Bit-Format? Für Bumpmaps also genauso:
128 -> 2MB
256 -> 16MB

Die klassische Normalenmap speichert ja nu Vektoren, also 3 Singles normalerweise:
128x128x128x3x32Bit -> 25MB
256x256x256x3x32Bit -> 192MB

Aber man kann ja den dritten Single durch die anderen beiden ausrechnen, da ja die Länge der Normalenvektoren 1 ist. Zusätzlich könnte man noch die Auflösung drastisch reduzieren, also 8Bit-Integer statt 32Bit-Floats nehmen. So kommen wir dann auf 2 Byte statt 3 Singles:
128 -> 4MB
256 -> 32MB


Also mehr als 256 wird nicht nötig sein, so groß werden die Objekte nicht sein auf dem Bildschirm. Die Anzahl der Texturen wird so 1 bis 3 sein, nicht mehr.

Jumpmaps: Ich habs mal überflogen, ist nicht das was ich suche. Bei Volumentexturen kann ich z.B. das Innere eines Objektes anders gestalten als das Äußere. Das wird bei Jumpmaps dann schwierig, bzw. ich hab noch immer dasselbe Problem. Außerdem sind die Texturen teilweise schon verzerrt, was ich nicht mag und was bei MEINEN Objekten wahrscheinlich noch viel schlimmer wird. Trotzdem danke.

Prozedurale Texturen wären natürlich Klasse, aber ich habe meine Zweifel, dass die schön genug sind :-) Ich weiß nicht, ob ich eine kraterübersähte Mondoberfläche mit sowas hinbekomme. Außerdem kommen mir die immer ziemlich rechenintensiv vor.
Hast du da mal ne Seite/Bilder, dass man sich anschauen kann, was damit so möglich ist? Ich kenne bisher nur gemasertes Holz.

Und nein: Comiclook ist NICHT erwünscht :-D


Momentan hab ich mich darauf eingeschossen:
Ich definiere lediglich die DichteBumpMap. Im Shader berechne ich daraus die Normale, indem ich die benachbarten Dichten betrachte. Dabei bedeutet letztendlich ein höherer Wert in der DichteBumpMap ein herausstehendes Teil beim Rendern (wie gehabt eigentlich).
Bin mir nur noch nicht sicher, ob das klappt.

Ist das gängig? Die Normalen im Shader aus der Bumpmap zu generieren? Oder werden die Normalen vorberechnet und eben in der Normalenmap abgelegt? Ersteres spart Speicherplatz, letzteres Zeit (vermutlich).

Danke

DerPeer

Offline

 

#4 12.04.2012 16:21:17

Gnietschow
ProMember
Ort: Berlin
Registriert: 20.06.2007
Beiträge: 237

Re: Normalenmap als Volumentextur

Asteroiden zerballern ist immer gut big_smile

Inwiefern es das Rendern verlangsamt weiß ich nicht, aber du kannst es ja einfach mal ausprobieren, dürfte ja nicht so viel Aufwand machen, wenn du die Volumentextur hast.

Meistens werden als Normalmap normale Bilder verwendet also mit 24 Bit. Bei Crytek oder so verwenden sie 16 Bit, da sie bei sehr glatten Oberflächen keine Artefakte haben wollen (welche ich zwar noch nie gesehen hab, aber egal wink ) Dabei wird die Normale direkt in den RGB-Kanälen verschlüsselt, da Zeit sparen letztendlich am wichtigsten ist.

Was das prozedurale angeht, da kenn ich mich auch nicht so aus. Es ist wohl sehr viel damit möglich, allein wenn man so die Möglichkeiten in Blender oder 3Ds Max sich anschaut, aber inwiefern das auch in Echtzeit im Shader zu coden ist weiß ich nicht. Vll kannst du ja über Blender deine Volumentexturen generieren, keine Ahnung was das so alles kann. Jedenfalls hatte ich bei 3Ds Max schonmal gesehen, dass man sich Volumentexturen 3D anzeigen lassen kann.

Hab noch ein paar Folien gefunden die sich mit dem Thema auseinander setzen, ist leider teilweise kaputt, also fehlen Bilder : http://www.cs.sunysb.edu/~vg05/panelFiles/vg05_rushmeier_post.pdf
Ansonsten hab ich mich mit der Thematik bisher auch recht wenig auseinander gesetzt, alles was ich sage kommt meist von Google smile

Denke das größte Problem was du haben wirst, ist das deine Volumentexturen auch nach Monkrateroberfläche aussehen. Die Generation wird recht schwierig werden. Aber ich lass mich auch gern mit interessanten Ansätzen überraschen wink

MfGnietschow


Es gibt 10 Gruppen von Menschen - die die das Binärsystem verstehen und die anderen.  :-)
Vegetarier essen meinem Essen das Essen weg ;)
-------------------------------------------------------------------------------------------------------------------
Der Community-Hub für Videospiele: gameloop.io

Offline

 

#5 12.04.2012 18:12:24

DerPeer
GodlikeMember
Ort: Berlin
Registriert: 04.02.2005
Beiträge: 1291

Re: Normalenmap als Volumentextur

Also, das Rendern geht in etwa genauso schnell. Ich habe keinen Unterschied messen können.

Das PDF ist leider nicht mehr so schön ohne die Bilder ;-)

Ich hab jetzt den Ansatz mit der Bumpmap verfolgt. Sie ist 256x256x256x8Bit groß, und die Normalen werden im Shader berechnet. Scheint bisher ganz gut zu klappen.
Allerdings sind 8Bit für eine Bumpmap etwas wenig, man sieht stellenweise die Sprünge - da muss ich mir noch was überlegen.

Die Mondkrateroberfläche ist im ersten Ansatz ganz gut gelungen, die Krater sind nur recht rechenaufwändig. Ich muss schauen, wie ich die Volumentextur nur dort mit Kratern fülle, wo auch die Oberfläche des Objektes ist.

Offline

 

#6 13.04.2012 07:35:10

DerPeer
GodlikeMember
Ort: Berlin
Registriert: 04.02.2005
Beiträge: 1291

Re: Normalenmap als Volumentextur

Mal ein Screenshot. Ja, die Kugel ist abgeplattet.
Es gibt keine Diffuse Map, allein die Bumpmap.

DerPeer


Attachments:
Attachment Icon krater.jpg, Größe: 161,459 bytes, Downloads: 444

Offline

 

#7 13.04.2012 08:24:19

DragonFlyOfGold
ProMember
Ort: Berlin
Registriert: 09.11.2005
Beiträge: 139

Re: Normalenmap als Volumentextur

Wow das sieht ja richtig gut aus! Durch die Bumpmap bzw. Geometriedetails brauchst du kaum ne Diffusemap.

DfoG

Offline

 

#8 13.04.2012 08:53:03

Gnietschow
ProMember
Ort: Berlin
Registriert: 20.06.2007
Beiträge: 237

Re: Normalenmap als Volumentextur

Sieht wirklich nett aus smile Nur die vielen kleinen Löchlein im rechts oberen Bereich sind zu viele oder zu dunkel. Und Asteroiden sind meist noch etwas unförmiger. Aber die Normalmap sieht echt cool aus! Wann darf ich die zerballern? big_smile

MfGnietschow


Es gibt 10 Gruppen von Menschen - die die das Binärsystem verstehen und die anderen.  :-)
Vegetarier essen meinem Essen das Essen weg ;)
-------------------------------------------------------------------------------------------------------------------
Der Community-Hub für Videospiele: gameloop.io

Offline

 

#9 14.04.2012 09:47:49

DerPeer
GodlikeMember
Ort: Berlin
Registriert: 04.02.2005
Beiträge: 1291

Re: Normalenmap als Volumentextur

Vielen Dank!

Ich werde noch eine Diffusemap mit 128^3 x 24Bit dazunehmen, die braucht ja nicht so hochauflösend zu sein. Aber ein wenig Farbe kommt sicher ganz gut.

Die Löcher oben rechts sehen wirklich nicht so gut aus, das stimmt. Ich muss da auch an der Definition der Krater noch rumbasteln. Außerdem wird das Objekt auf dem Bildschirm auch nicht SO groß sein.

Die Unförmigkeit der Asteroiden muss ich auch noch hinbekommen. Da das aber im Ursprung Volumendefinitionen sind (Voxel), sollte das nicht allzu schwer sein. Hier muss doch irgendwo noch eine Kartoffel rumliegen...

Ein wenig werd ich für das Spiel noch brauchen. Hab noch kein schönes Raumschiff, und die Effekte sind auch meist viel Arbeit - wenn auch nicht so knifflig.

DerPeer

Offline

 

Brett Fußzeile

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson