Warning: Constant ABSPATH already defined in /customers/e/7/0/florian-oeser.de/httpd.www/wordpress/wp-config.php on line 28 Warning: Cannot modify header information - headers already sent by (output started at /customers/e/7/0/florian-oeser.de/httpd.www/wordpress/wp-config.php:28) in /customers/e/7/0/florian-oeser.de/httpd.www/wordpress/wp-includes/rest-api/class-wp-rest-server.php on line 1723 Warning: Cannot modify header information - headers already sent by (output started at /customers/e/7/0/florian-oeser.de/httpd.www/wordpress/wp-config.php:28) in /customers/e/7/0/florian-oeser.de/httpd.www/wordpress/wp-includes/rest-api/class-wp-rest-server.php on line 1723 Warning: Cannot modify header information - headers already sent by (output started at /customers/e/7/0/florian-oeser.de/httpd.www/wordpress/wp-config.php:28) in /customers/e/7/0/florian-oeser.de/httpd.www/wordpress/wp-includes/rest-api/class-wp-rest-server.php on line 1723 Warning: Cannot modify header information - headers already sent by (output started at /customers/e/7/0/florian-oeser.de/httpd.www/wordpress/wp-config.php:28) in /customers/e/7/0/florian-oeser.de/httpd.www/wordpress/wp-includes/rest-api/class-wp-rest-server.php on line 1723 Warning: Cannot modify header information - headers already sent by (output started at /customers/e/7/0/florian-oeser.de/httpd.www/wordpress/wp-config.php:28) in /customers/e/7/0/florian-oeser.de/httpd.www/wordpress/wp-includes/rest-api/class-wp-rest-server.php on line 1723 Warning: Cannot modify header information - headers already sent by (output started at /customers/e/7/0/florian-oeser.de/httpd.www/wordpress/wp-config.php:28) in /customers/e/7/0/florian-oeser.de/httpd.www/wordpress/wp-includes/rest-api/class-wp-rest-server.php on line 1723 Warning: Cannot modify header information - headers already sent by (output started at /customers/e/7/0/florian-oeser.de/httpd.www/wordpress/wp-config.php:28) in /customers/e/7/0/florian-oeser.de/httpd.www/wordpress/wp-includes/rest-api/class-wp-rest-server.php on line 1723 Warning: Cannot modify header information - headers already sent by (output started at /customers/e/7/0/florian-oeser.de/httpd.www/wordpress/wp-config.php:28) in /customers/e/7/0/florian-oeser.de/httpd.www/wordpress/wp-includes/rest-api/class-wp-rest-server.php on line 1723 {"id":407,"date":"2009-06-23T20:02:34","date_gmt":"2009-06-23T19:02:34","guid":{"rendered":"http:\/\/www.florian-oeser.de\/?p=407"},"modified":"2009-06-23T20:02:34","modified_gmt":"2009-06-23T19:02:34","slug":"simple-raytracer-part-2-refractionnormalmapping","status":"publish","type":"post","link":"http:\/\/www.florian-oeser.de\/2009\/06\/23\/simple-raytracer-part-2-refractionnormalmapping\/","title":{"rendered":"simple RayTracer Part 2 (Refraction+NormalMapping)"},"content":{"rendered":"
Es ist soweit. Heute m\u00f6chte ich den vorerst letzten Part des Raytracers vorstellen und ver\u00f6ffentlichen. Nachdem mit Part 1<\/a> der Grundstein gelegt wurde hier nun erst einmal die \u00c4nderungen und Erweiterungen auf einem Blick:<\/p>\n Zun\u00e4chst m\u00f6chte ich zwei Bilder zeigen, welche den aktuellen Stand repr\u00e4sentieren, bevor ich dann einzelne Punkte noch einmal kurz aufgreifen werde. Beide Bilder zeigen das Phong-Model mit Reflection und Refraction kombiniert mit NormalMapping. \n Das NormalMapping in diesem Raytracer unterscheidet sich vom gewohnten NormalMapping aus der 3D-RealTime Grafik in zwei Punkten. Zun\u00e4chst ist der RayTracer statisch, sprich es gibt keine bewegten Lichtquellen bzw. Objekte. NormalMapping kommt erst dabei richtig zum Tragen bzw. entfaltet so eigentlich erst seine sichtbare Wirkung. Aus diesem Grund kann man den Effekt nur deutlich machen indem man zwei an sich identische Bilder direkt miteinander vergleicht. Weiterhin sind f\u00fcr das NormalMapping in dem Raytracer keine Object- oder Tangentspace Berechnungen notwendig sondern lediglich die Berechnungen des Normalenvektors aus der NormalMap. Das sind dann \u00fcblicherweise so bzw. so \u00e4hnlich aus:<\/p>\n Dieser Normalenvektor ersetzt dann einfach, bei der Diffuseberechnung, den Normalenvektor der an dem Schnittpunkt des Rays mit der Plane bzw. Sphere errechnet wurden w\u00e4re.<\/p>\n Bei der Berechnung von Refraction (Lichtbrechung) habe ich mich auf das hervorragende Tutorial<\/a> von Jacco Bikker<\/span><\/span><\/span> gest\u00fctzt. Hier nocheinmal ein Bild vom Anfang:<\/p>\n \n Man kann deutlich einen unterschiedlichen Brechungsindex<\/a> zwischen der linken, organgen und der rechten, lilanen Sphere erkennen. Der Brechungsindex eines Mediums ist die Angabe wie schnell die Lichtgeschwindigkeit in diesem Medium abnimmt. Sprich das Verh\u00e4ltnis zwischen der Phasengeschwindigkeit des Lichtes im Vakuum und der Phasengeschwindigkeit des Mediums. Die linke Sphere definiert eine Phasengeschwindigkeit von 1.33 welches Wasser bei 20\u00b0 Celsius entspricht. Folglich verliert das Licht 25% (1\/1.33) seiner Geschwindigkeit gegen\u00fcber der Geschwindigkeit im Vakuum. \u00dcber das Snelliussches Brechungsgesetz<\/a> kann man dann, \u00fcber die unterschiedlichen Brechungsindizes, die eigentliche Brechung berechnen. \n Auch im Bereich der Performance hat sich einiges getan. Dies aber lediglich \u00fcber Implementierungsoptimierungen und nicht \u00fcber Beschleunigungsans\u00e4tze wie beispielsweise ein Spatial Tree. Trotzdem kann sich der Zuwachs sehen lassen. Ein Bild mit sieben texturierten Spheren und entsprechender Plane, bei 1000×1000, sechs Rekursionen f\u00fcr Reflection ist mehr als doppelt so schnell berechnet wie das selbe Bild ohne Texturen f\u00fcr die Spheren. Das ist in der Hinsicht imposant da die Berechnungen der entsprechenden UV-Koordinaten und das eigentliche fetchen des Texels einen nicht unerheblicher Mehraufwand darstellt. Die Optimierung r\u00fchrt zum Gro\u00dfteil daher das die Materialklassen, welche relativ viel Speicher durch die Texturen in Anspruch nehmen, nun als Pointer gehandelt werden und so nicht jedes mal auf dem Stack hin und her kopiert werden m\u00fcssen.<\/p>\n Hier nun der Download. Zum einen ein reiner Release-Build und weiterhin der komplette Source (VS bzw. VC++Express Solution). Das .NET 2.0 Framework wird vorrausgesetzt.<\/p>\n Release<\/a> (.rar, 3.3MB)\n
\n<\/a><\/a><\/p>\nNormalMapping<\/h4>\n
\n<\/a><\/a><\/a><\/a><\/p>\n\r\ncolor normal = normalMap.getTexelBilinear( u, v, distance );\r\ndouble x = (normal.add(color(-1,0,0))).mult(2.0f).r;\r\ndouble y = (normal.add(color(0,-1,0))).mult(2.0f).g;\r\ndouble z = (normal.add(color(0,0,-1))).mult(2.0f).b;\r\n<\/pre>\n
Refraction<\/h4>\n
\nDie rechte, lilane Sphere hat eine Phasengeschwindigkeit von 1.0 und ist folglich derer im Vakuum gleich. Daraus resultiert dann auch das die hintere, gelbe Sphere ohne Brechungen sichtbar ist. Im \u00dcbrigen hat die vordere, g\u00fcne Sphere eine Phasengeschwindigkeit von 1.31 (Eis).
\nJetzt noch zwei Bilder aus einer anderen Perspektive, welche nebenbei auch nocheinmal den NormalMapping Effekt gut verdeutlichen:
\n<\/a><\/a><\/p>\nPerformance<\/h4>\n
Download<\/h4>\n
\nsGUIRayTracer-Solution<\/a> (.rar, 3.3MB)<\/p>\nInteressante Links\/Quellen<\/h4>\n