Berühren Sie den neuesten physikbasierten Renderer Mitsuba2 (2) Move from Python

Was ist Mitsuba2?

Ein kostenloser physikbasierter Renderer für Akademiker. Es gibt neue Funktionen wie differenzierbares Rendering und polarisiertes Rendering. Dieser Artikel ist eine Fortsetzung von Einführung. Es wird davon ausgegangen, dass Mitsuba2 installiert wurde.

Andere verwandte Artikel, die ich geschrieben habe.

Führen Sie Mitsuba2 von Python aus

Wie offiziell geschrieben Mitsuba2 bietet sehr leistungsstarke Python-Bindungen und fast alle Funktionen Kann von Python aus verwendet werden. Natürlich können Sie es auch in das Jupyter Notebook importieren und verschiedene Entwicklungen interaktiv durchführen. Darüber hinaus wird davon ausgegangen, dass es mit PyTorch funktioniert, und die Optimierung mit PyTorch kann sehr einfach beschrieben werden.

Versuchen Sie zunächst, sich zu bewegen

** Das Verfahren gilt für Windows 10 (Informationen ab dem 10. März 2020). ** ** ** Der Beamte hat Python-Rendering-Testcode bereitgestellt, und mein Ziel ist es, ihn ausführen zu können. Wenn Sie dieses Mal Einführung (1) beendet haben, gibt es meines Erachtens nichts zu fangen. Ich werde Schritt für Schritt erklären.

Unterstützte Versionen von Python

Laut dem Beamten Es wird gesagt, dass es 3.6 oder höher unterstützt. Wenn es also weniger ist, aktualisieren Sie es. ..

Durch den Pfad gehen

Zuerst müssen Sie das mitsuba2-Modul in Ihren PATH einfügen, damit es in Python importiert werden kann. Es gibt verschiedene Möglichkeiten, dies zu tun, aber hier werden wir das vom Beamten bereitgestellte Skript verwenden. Es wird davon ausgegangen, dass sich die in Introduction (1) erstellte Bibliothek und ausführbare Datei in mitsuba2 \ build \ dist \ befinden. Im Stammverzeichnis befindet sich eine Batch-Datei mit dem Namen "setpath.bat". Drücken Sie sie daher an der Eingabeaufforderung (cmd). (Wenn Sie Power Shell verwenden, werden beim Drücken von "bat" keine Umgebungsvariablen zurückgegeben. Sie müssen das Skript daher neu schreiben. ).

mitsuba2> setpath.bat

Dadurch wird der Pfad an die ausführbare Datei und das Python-Modul "im ausgeführten cmd" übergeben, und Mitsuba2 kann überall verwendet werden. Beginnen wir mit ipython und importieren wir mitsuba2.

mitsuba2> ipython
Python 3.7.4 (tags/v3.7.4:e09359112e, Jul  8 2019, 20:34:20) [MSC v.1916 64 bit (AMD64)]
Type 'copyright', 'credits' or 'license' for more information
IPython 7.10.1 -- An enhanced Interactive Python. Type '?' for help.

In [1]: import mitsuba

Wenn kein Importfehler vorliegt, ist der Pfad zum Mitsuba2-Modul vorhanden. ** Es ist mitsuba2, aber bitte beachten Sie, dass das zu importierende Modul "mitsuba" ist. ** ** **

Verschieben wir nun den Testcode sofort. Verwenden Sie "cmd, das das Skript ausgeführt hat", um in das vom Beamten bereitgestellte Beispielcodeverzeichnis zu wechseln. Das entsprechende Verzeichnis befindet sich in mitsuba2 \ docs \ examples \ 01_render_scene \.

mitsuba2> cd docs\examples\01_render_scene\
mitsuba2\docs\examples\01_render_scene>

Render_scene.py im Verzeichnis ist Beispielcode, der zum Rendern auf Mitsuba2 in Python trifft. Öffnen wir es mit einem geeigneten Editor.


import os
import numpy as np
import mitsuba

# Set the desired mitsuba variant
mitsuba.set_variant('scalar_rgb')

from mitsuba.core import Bitmap, Struct, Thread
from mitsuba.core.xml import load_file

# Absolute or relative path to the XML file
filename = 'path/to/my/scene.xml'

# Add the scene directory to the FileResolver's search path
Thread.thread().file_resolver().append(os.path.dirname(filename))

# Load the actual scene
scene = load_file(filename)

# Call the scene's integrator to render the loaded scene
scene.integrator().render(scene, scene.sensors()[0])

# After rendering, the rendered data is stored in the film
film = scene.sensors()[0].film()

# Write out rendering as high dynamic range OpenEXR file
film.set_destination_file('/path/to/output.exr')
film.develop()

# Write out a tonemapped JPG of the same rendering
bmp = film.bitmap(raw=True)
bmp.convert(Bitmap.PixelFormat.RGB, Struct.Type.UInt8, srgb_gamma=True).write('/path/to/output.jpg')

# Get linear pixel values as a numpy array for further processing
bmp_linear_rgb = bmp.convert(Bitmap.PixelFormat.RGB, Struct.Type.Float32, srgb_gamma=False)
image_np = np.array(bmp_linear_rgb)
print(image_np.shape)

** Lassen Sie es uns zuerst verschieben, bevor Sie den Code verstehen. ** ** ** Da es keine Szenendatei zum Rendern gibt, bereiten Sie eine Szenendatei vor. Ich denke, dass Sie bereits einen Rendering-Test im einleitenden Teil (1) haben, aber git das Beispiel-Repository für Szenendaten woanders klonen.

git clone https://github.com/mitsuba-renderer/mitsuba-data.git

Sie können hier den Pfad des lokalen Repositorys angeben, der Übersichtlichkeit halber jedoch diesmal auch "mitsuba_data / scene / cbox" für jedes Verzeichnis, das aktuelle Testcodeverzeichnis "mitsuba2 \ docs \ examples \ 01_render_scene " Bitte kopieren Sie nach `.

Lesen Sie dann diese Szenendatei in Ihrem Code und schreiben Sie sie an nur drei Stellen neu, um sie an die richtige Stelle zu schreiben.

# filename = 'path/to/my/scene.xml'
filename = 'cbox/cbox.xml' # l.12
# film.set_destination_file('/path/to/output.exr')
film.set_destination_file('cbox/output.exr') # l.27
# bmp.convert(Bitmap.PixelFormat.RGB, Struct.Type.UInt8, srgb_gamma=True).write('/path/to/output.jpg')
bmp.convert(Bitmap.PixelFormat.RGB, Struct.Type.UInt8, srgb_gamma=True).write('cbox/output.jpg') # l.32

Alles was Sie tun müssen, ist es in Python auszuführen. (Bitte pip install numpy)

python render_scene.py

Wenn das Rendern erfolgreich abgeschlossen wurde, werden zwei Dateien, "cbox \ output.exr" und "cbox \ output.jpg ", generiert. exr ist das gleiche wie die Einleitung (1), 32bit x 3ch gerendertes Bild, jpg ist 8bit x 3ch komprimiertes Bild. output.jpg

Verstehen Sie den Beispielcode

Nachdem wir den Beispielcode erfolgreich verschoben haben, wollen wir den Code Schritt für Schritt verstehen.

import os
import numpy as np
import mitsuba

Ich importiere ein Modul, nichts hat sich geändert.

# Set the desired mitsuba variant
mitsuba.set_variant('scalar_rgb')

Gibt eine Variante (Rendereinstellung) von mitsuba2 an. Varianten werden in Einleitung (1) erläutert. ** Dies muss aus den bei CMake angegebenen ausgewählt werden. ** Wenn Sie mit einer anderen Variante rendern möchten, die Sie nicht erstellt haben, müssen Sie zu CMake zurückkehren und neu erstellen. Dieses Mal werden wir mit der grundlegendsten Variante namens "scalar_rgb" rendern, die nicht SIMDized (skalar) ist und ein RGB-Strahl (rgb) ist, der Spektrum und Polarisation nicht berücksichtigt.

from mitsuba.core import Bitmap, Struct, Thread
from mitsuba.core.xml import load_file

Importieren Sie "Bitmap, Struct, Thread" aus "mitsuba.core". Importieren Sie auch load_file aus mitsuba.core.xml. Ich werde jedes später erklären, wenn ich es benutze.

# Absolute or relative path to the XML file
filename = 'cbox/cbox.xml'

# Add the scene directory to the FileResolver's search path
Thread.thread().file_resolver().append(os.path.dirname(filename))

# Load the actual scene
scene = load_file(filename)

Geben Sie den Namen der Szenendatei im zu lesenden XML-Format an und laden Sie ihn mit der Funktion load_file (), die die Szenendatei liest. Thread.thread (). File_resolver () löst das Problem, dass der Link zu der Datei in der Szenendatei als relativer Pfad geschrieben wird, indem der Name und der Pfad angegeben und als Suchpfad festgelegt werden. Ohne dies erhalten Sie eine Fehlermeldung, dass die Objektdatei nicht gefunden werden kann.

# Call the scene's integrator to render the loaded scene
scene.integrator().render(scene, scene.sensors()[0])

Rufen Sie den Integrator (Integrator) auf, um die importierte Szene zu rendern. Das erste Argument ist die Szene (scene) und das zweite Argument ist der Sensor (scene.sensors () [0]), der rendert (beschrieben in der Szenendatei). Mit [0] können Sie angeben, über welchen der verschiedenen Sensoren Sie verfügen.

# After rendering, the rendered data is stored in the film
film = scene.sensors()[0].film()

# Write out rendering as high dynamic range OpenEXR file
film.set_destination_file('cbox/output.exr')
film.develop()

Laden Sie den Film (scene.sensors () [0] .film ()) für die in der Szenendatei beschriebenen Sensoren. Der Film hat die Aufgabe, die Ausgabe von Daten und die Nachbearbeitung einzustellen. Stellen Sie den Namen der Ausgabedatei mit "film.set_destination_file" ein. Entwickle cbox \ output.ext mit film.develop ().

# Write out a tonemapped JPG of the same rendering
bmp = film.bitmap(raw=True)
bmp.convert(Bitmap.PixelFormat.RGB, Struct.Type.UInt8, srgb_gamma=True).write('cbox/output.jpg')

Es wird eine 8-Bit-Entwicklungsverarbeitung sein. Gibt ein Bitmap-Objekt zurück, das vor dem Film entwickelte Inhalte mit "film.bitmap (raw = True)" speichert. ** Die Bedeutung des Arguments "raw" ist unbekannt, da es noch nicht offiziell beschrieben wurde. ** ** ** Darüber hinaus wird eine 8-Bit-Entwicklungsverarbeitung für das Bitmap-Objekt mit "convert" durchgeführt. Geben Sie RGB mit "Bitmap.PixelFormat.RGB" an, geben Sie 8 Bit mit "Struct.Type.UInt8" an und wenden Sie die Gamma-Tonkarte von SRGB mit "srgb_gamma = True" an.

# Get linear pixel values as a numpy array for further processing
bmp_linear_rgb = bmp.convert(Bitmap.PixelFormat.RGB, Struct.Type.Float32, srgb_gamma=False)
image_np = np.array(bmp_linear_rgb)
print(image_np.shape)
# (256, 256, 3)

Mit dem gleichen "Konvertieren" erhalte ich einen linearen RGB-Wert, der nicht mit einem Numpy-Array 8-Bit-komprimiert ist. Es hat nichts mit dem Ausgabeergebnis zu tun, aber Sie können sehen, dass ** das Rendering-Ergebnis mit dem numpy-Array leicht erhalten werden kann. ** ** **

Zusammenfassung

Ich habe den Beispielcode verschoben und mir den Inhalt des Codes angesehen, um zu verstehen, wie Mitsuba2 aus Python verschoben wird. Ich hoffe, Sie haben festgestellt, dass das grundlegende Rendern in Python mit einer sehr einfachen Beschreibung funktioniert. Ab dem nächsten Mal werde ich erklären, wie neue Funktionen wie differenzierbares Rendering und polarisiertes Rendering verwendet werden.

das ist alles.

Recommended Posts

Berühren Sie den neuesten physikbasierten Renderer Mitsuba2 (2) Move from Python
Berühren Sie den neuesten physikbasierten Renderer Mitsuba2 (3) Differenzierbares Rendering
Installieren Sie das neueste Python von pyenv, das von Homebrew installiert wurde
Existenz aus Sicht von Python
Verwenden Sie die Flickr-API von Python
Lernen Sie die Grundlagen, während Sie Python-Variablen berühren
Notizen vom Anfang von Python 1 lernen
Grundlagen zum Ausführen von NoxPlayer in Python
Starten Sie den Python-Interpreter über Git Bash
Ab Python 3.4 wird pip zum Standardinstallationsprogramm! ??
Notizen vom Anfang von Python 2 lernen
[Python] Holen Sie sich die Hauptfarbe aus dem Screenshot
Ich habe versucht, zwei Jetson Nano-Hardware-PWMs aus der Jetson.GPIO Python-Bibliothek auszuführen.
Holen Sie sich den Inhalt von Git Diff aus Python
Identifizieren Sie die Plattform, auf der Python ausgeführt wird (Kaggle / Colab / Windows).
Verwenden Sie das nghttp2 Python-Modul von Homebrew aus pyenvs Python
Rufen Sie Polly aus dem AWS SDK für Python auf
Versuchen Sie, direkt von Python 3 aus auf die YQL-API zuzugreifen
Vom Anfangszustand von CentOS8 bis zum Ausführen von PHP Python Perl Ruby mit Nginx