Laden...

Zusammenspiel von Material- und Lichteigenschaften

Erstellt von Wurzel vor 18 Jahren Letzter Beitrag vor 18 Jahren 4.725 Views
Wurzel Themenstarter:in
19 Beiträge seit 2005
vor 18 Jahren
Zusammenspiel von Material- und Lichteigenschaften

Moin moin,

Könnte mir bitte jemand in ein paar Sätzen das Zusammenspiel von den Material- und Lichteigenschaften erklären?
Oder weiß jemand ein gutes Tutorial zu dem Thema?

Was mich momentan ein wenig verwirrt, ist dass ich bei dem Material diverse Farben für Diffuse, Ambient etc einstellen kann und die Lichter auch die selben Eigenschaften haben. Wie die beiden Sachen sich gegenseitig beeinflussen ist mir rätselhaft.

Mal angenommen ich möchte einfach mal eine dunkelblaue Kugel darstellen, die bei Lichteinfall ein kleinen weißen Glanzpunkt haben soll. Das/die Lichter sollen einfaches, weißes Licht ausstrahlen.

Grüße, Jörg

M
456 Beiträge seit 2004
vor 18 Jahren

Das Beleuchtungsmodell, welches Direct3D verwendet, ist dem von Phong nachempfunden (aber auf Vertexebene nicht auf Pixelebene).

Dieses Modell setzt sich aus den 3 Komponenten zusammen, die du hier schon aufgezählt hast:

Ambient: Eine gleichmäßige Farbaufhellung über das gesammte Objekt hinweg. Wird eigentlich nur verwendet um die diffuse Interreflektionen zu faken (Global Illumination)

Diffuse: Wird einfach nach Lambert berechnet (Normale*Lichtvektor). Je flacher das Licht auf eine Oberfläche eintrifft, desto dunkler ist sie. Schau dir mal z.B. ein Ei neben einer Lichtquelle an 😉. Seine Oberfläche ist ein typischer diffuser Reflektor.

Specular: Das sind die Glanzpunkte auf den Objekten.

Wie das berechnet wir, kannst du dir hier anschauen:
http://de.wikipedia.org/wiki/Phong_Shading
Die Materialparameter von Direct3D manipulieren die Koeffizienten ks, kd, ka und n

Für deine Kugel bedeutet das (als RGB):
diffuse = (0.0,0.0,0.5) (Dunkelblau)
specular = (1.0,1.0,1.0) (Weiß)
Für kleine Glanzpunkte specularen Exponenten hoch setzen. (Heißt in D3D glaube ich Power)
Eventuell noch etwas Ambient, damit die Schattenseite nicht komplett schwarz ist.

I am Jack's smirking revenge.
I am Jack's raging bile duct.
I am Jack's cold sweat.
I am Jack's complete lack of surprise.
I am Jack's broken heart.
I am Jack's wasted life.

Wurzel Themenstarter:in
19 Beiträge seit 2005
vor 18 Jahren

Danke für deine ausführliche Antwort.
Was die 3 Komponenten angeht weiß ich schon einigermaßen bescheid - hab diverse Stunden mit 3ds max zugebracht 😉 Ist aber auf jeden Fall eine tolle Erklärung für die Problematik.

Aber wie spielen denn die Einstellungen für die Lichter und die Materialien zusammen? Werden die Komponenten addiert, oder überschreiben die Einstellungen der Lichter die anderen, oder oder oder? 🙂

Mir ist aufgefallen, dass die Glanzpunkte ziemlich "ausgefranst" aussehen. Das hängt dann wohl damit zusammen, dass das Shading auf Vertexebene passiert, oder? Ohne HLSL kann man das nicht auf Pixelebene machen, oder?

Danke und Grüße,
Jörg

M
456 Beiträge seit 2004
vor 18 Jahren

Wie die diffusen, ambienten, specularen Eigenschaften mit mem Material interagieren weiß ich auch nicht 100%, da ich meine Beleuchtungsmodelle meist selbst programmiere. Ich glaube aber, dass diese Werte mit den jeweils korrespondierenden Parametern des Materials moduliert werden.

Ohne Pixelshader kannst du die Beleuchtung nur auf Vertexebene berechnen. Wenn es echtes Perpixel-Lightning sein soll (mit allem Schnickschnack wie Gloss- und Bumpmapping), musst du das schon selbst programmieren. Das geht ganz gut mit Normaleninterpolation wie beim Phong-Modell (Stichwort: Tangent-Space)

I am Jack's smirking revenge.
I am Jack's raging bile duct.
I am Jack's cold sweat.
I am Jack's complete lack of surprise.
I am Jack's broken heart.
I am Jack's wasted life.

Wurzel Themenstarter:in
19 Beiträge seit 2005
vor 18 Jahren

Hauahauaha 🙂
Hört sich alles nicht unkompliziert an.
Ich hab mir das Buch "Managed DirectX 9" gekauft und finde das soweit auch recht gut. Aber irgendwie bleiben trotzdem noch tausend Fragezeichen offen.

Würde es dir was ausmachen, wenn du mir mal ein bischen Code von dir schicken könntest? Ich würde gerne mal sehen, wie man sowas richtig macht. Vielleicht generiert das bei mir ja das eine oder andere Aha-Erlebnis. Wäre echt super.

Vielen Dank soweit und schöne Grüße,
Jörg

M
456 Beiträge seit 2004
vor 18 Jahren

Uff, ich hab schon lang nichts mehr mit Direct3D gemacht.

Ich arbeite zur Zeit an einer etwas umfangreicheren Raytracing-Software (mit Monte Carlo Raytracing, Cook-Torrance-Shading, HDRI ...).
Mit dem selbst berechneten Beleuchtungsmodellen meinte ich, dass ich das alles von Hand in Software programmiere ohne hardwarebeschleunigten Scanlinerasterizer.

Deswegen sind meine Direct3D Kenntnisse etwas eingerostet und ich kann dir vorallem mit der Beantwortung von prinzipiellen Fragen zur 3D-Grafikprogrammierung dienen. Wie das dann in HLSL aussieht, musst du dir dann irgendwie selbst aus den Fingern saugen 😉

I am Jack's smirking revenge.
I am Jack's raging bile duct.
I am Jack's cold sweat.
I am Jack's complete lack of surprise.
I am Jack's broken heart.
I am Jack's wasted life.

Wurzel Themenstarter:in
19 Beiträge seit 2005
vor 18 Jahren

Verstehe. Macht aber auch nichts.
Vielleicht sollte ich das ohnehin nach und nach machen. Am Besten ich fange erstmal mit Transformationen und UserInput an und mach mich da erstmal richtig fit.
So umfangreich, wie das Thema ist, muss man sich da glaube ich wirklich erstmal einen Teil raussuchen und die Sachen nach einander angehen.
Ansonsten blick ich vielleicht gar nicht mehr durch und gebe frustriert auf.

Ja, dann kann ich dir nur viel Erfolg bei deinem Raytracer wünschen. Ist sicher eine interessante Geschichte...wenn auch nicht einfach 🙂 Schreibst du den in C#?

Grüße, Jörg

M
456 Beiträge seit 2004
vor 18 Jahren

Ja, ich schreib den Raytracer komplett in C#. Einige werden vielleicht murren und sagen das ist ja sooo langsam. Aber ich muss da widersprechen. Die Performance einbußen sind durchaus akzeptabel (um die 20% würd ich sagen - aber in Zukunft darf man ja auch auf noch bessere JITs hoffen 😉 )

Hab das Dingen erst mal mit C++ geschrieben, dann aber aufgegeben, weil ich ihn komplett modular machen wollte und Plugin-Programmierung in C++ ziemlich nervig ist.

Wenn er mal ein gewisses Stadium erreicht hat, werde ich ihn vielleicht bei den Projekten hier vorstellen.

I am Jack's smirking revenge.
I am Jack's raging bile duct.
I am Jack's cold sweat.
I am Jack's complete lack of surprise.
I am Jack's broken heart.
I am Jack's wasted life.

Wurzel Themenstarter:in
19 Beiträge seit 2005
vor 18 Jahren

Da bin ich mal gespannt drauf.
Würde mich durchaus interessieren, wie man sowas macht 🙂
Ein Mathe- und ein Physikbuch hast du bestimmt auf dem Schreibtisch, oder?

Grüße, Jörg

M
456 Beiträge seit 2004
vor 18 Jahren

Na ja, ich stütze mich vorallem auf diverse Publikationen aus dem Netz und Computergrafikbücher von Alan Watt z.B. oder schau mir einfach Open-Source Raytracer wie PovRay oder YafRay an.

I am Jack's smirking revenge.
I am Jack's raging bile duct.
I am Jack's cold sweat.
I am Jack's complete lack of surprise.
I am Jack's broken heart.
I am Jack's wasted life.

Wurzel Themenstarter:in
19 Beiträge seit 2005
vor 18 Jahren

Hättest du da ein paar Links auf Lager? 🙂

Wurzel Themenstarter:in
19 Beiträge seit 2005
vor 18 Jahren

Wow, vielen Dank dir. Da werde ich mich mal durchwühlen müssen 🙂

Wie lange beschäftigst du dich denn schon mit der Materie?

M
456 Beiträge seit 2004
vor 18 Jahren

Hab früher (vor 2 Jahren etwa) mal nen primitiven Raytracer geschrieben. Simple Kugeln, Polygone usw.
Hab das dann aber etwas aus dem Auge verloren 😉
Intensiver beschaftige ich mich aber mit der ganzen Sache seit etwa einem halben Jahr. Möchte diesmal aber nicht nur nen primitiven Raytracer schreiben, sondern auch erweiterte Techniken wie Monte Carlo Raytracing mit einbeziehen, um Global Illumination zu simmulieren. Einiges geht schon soweit ganz gut aber ich hab noch viel zu tun 😉

Hier mal ein kleines Testrendering (man achte auf das Color-Bleeding an der hinteren Wand, das durch diffuse Abstahlung der roten und grünen Wände entsteht):

I am Jack's smirking revenge.
I am Jack's raging bile duct.
I am Jack's cold sweat.
I am Jack's complete lack of surprise.
I am Jack's broken heart.
I am Jack's wasted life.

Wurzel Themenstarter:in
19 Beiträge seit 2005
vor 18 Jahren

Das sieht doch schon wirklich vielversprechend aus 👍 Alle Achtung !!!
Wie lange war denn die Renderzeit bei wie vielen Traces und Bounces?
Mit welchen Daten fütterst du den denn? Hast du dir ein Plugin für 3ds max oder so geschrieben?

M
456 Beiträge seit 2004
vor 18 Jahren

Das Rendering dauert noch recht lange. Etwa 10 Minuten mit Global Illumination. Hoffe aber das noch optimieren zu können. (Ohne GI daueret es nur ein paar Sekunden)
Ich taste die Hemisphäre mit 300 Samples pro NBildpunkt ab.
Nehmen wir an ein Bild ist 320x200 Bildpunke groß, hat 7 Objekte und wird mit 300 Samples abgetastet, dann haben wir über 134 Mio Schnittpunkttests.

Ich will in Zukunft einen Importer für Wavefront OBJ Dateien schreiben, eventuell auch für 3ds Files.

I am Jack's smirking revenge.
I am Jack's raging bile duct.
I am Jack's cold sweat.
I am Jack's complete lack of surprise.
I am Jack's broken heart.
I am Jack's wasted life.

Wurzel Themenstarter:in
19 Beiträge seit 2005
vor 18 Jahren

Ja, da kommt schnell ordentlich was zusammen.

Ein Import wäre fast Pflicht. Ich hab damals (zu 486er-Zeiten :--)) ein bischen mit povRay rumgespielt. Naja, eigentlich hab ich mehr mit einem Modeller dafür rumgespielt. Und der war auch so umständlich, dass ich irgendwann die Lust dazu verloren habe. Bie 3ds max oder Maya sieht die Sache anders aus 🙂

Ich frage mich gerade, wo du deine Motivation her nimmst. Ich meine in Zeiten von Mental Ray, Renderman, Brazil, VRay und wie sie alles heißen einen eigenen Raytracer zu schreiben !? Möchtest du mal in dem Bereich arbeiten? Oder zeigen, dass man sowas auch mit C# realisieren kann? Versteh die Frage bitte nicht falsch, ja? 😉

Grüße, Jörg

M
456 Beiträge seit 2004
vor 18 Jahren

Die Motivation lautet einfach:
Spaß 🙂

Ich werde vielleicht nicht unbedingt mit großer Rendering Software konkurrieren können aber das ist eigentlich auch nicht unbedingt mein Ziel.
Ich wollte damit meinen Horrizont über 3D Grafik erweitern. Noch dazu hatte ich ein Praktikum an der UNI und musste quasi "zwangsweise" einen Raytracer schreiben 😉
Es gibt natürlich viel Spielraum für Erweiterungen: Netzwerkrendering, paralleles Rendern auf mehreren Prozessoren usw.
Es ist einfach ein Hobbyprojekt, welches ich weiterführe und Schritt für Schritt ausbaue. Da der Raytracer auf Plugins aufbaut, ist es relativ einfach zu bewerkstelligen neue Shader, Primitive und Co. einzubauen.
Und natürlich möchte ich auch zeigen das so was mit C# geht 😉

Na ja, jetzt sind wir so weit vom eigentlichem Threadthema abgekommen.

I am Jack's smirking revenge.
I am Jack's raging bile duct.
I am Jack's cold sweat.
I am Jack's complete lack of surprise.
I am Jack's broken heart.
I am Jack's wasted life.

Wurzel Themenstarter:in
19 Beiträge seit 2005
vor 18 Jahren

Hehe. Ja, mit dem Thema hat das wirklich nicht mehr viel zu tun. 🙂
Aber trotzdem sehr interessant, wie ich finde. Darf ich fragen, was du eigentlich arbeitest? Oder ist 3D-Programmierung reines Hobby?

Ansonsten kann ich deine Motivation durchaus verstehen. Wollte nur mal nachfragen 🙂
Ja, mach weiter so und ich bin schon sehr gespannt, wenn du das veröffentlichst. Da werde ich mit Sicherheit einen Blick riskieren. Und wer weiß...vielleicht bin ich ja bis dahin soweit, dass ich auch ein PlugIn dazu schreiben kann 😉

Grüße, Jörg

PS: ...aber bis es soweit ist mach ich mal lieber meine Direct3D-Basics 🙂

M
456 Beiträge seit 2004
vor 18 Jahren

Arbeiten tu ich nur als Student an einer Technischen Universität 😉 Wenn ich nicht gerade was anders zu tun habe, schreibe ich an dem Raytracer weiter.

Veröffentlich werd ich das sicherlich irgendwann mal. Bis dahin hab ich aber noch so einiges zu tun (Importer und Octree haben zur Zeit höchste Priorität). Mal sehen wie ich so Zeit habe 🙂

I am Jack's smirking revenge.
I am Jack's raging bile duct.
I am Jack's cold sweat.
I am Jack's complete lack of surprise.
I am Jack's broken heart.
I am Jack's wasted life.

Wurzel Themenstarter:in
19 Beiträge seit 2005
vor 18 Jahren

Sag mal, bist du eigentlich im ICQ?
Hast nämlich schon recht...eigentlich passt das hier nicht mehr wirklich ins Forum rein 🙂