Un moteur de rendu basé sur la physique gratuit pour les universitaires. Il existe de nouvelles fonctionnalités telles que le rendu différenciable et le rendu polarisé. Cet article est la suite de Introduction. On suppose que Mitsuba2 a été installé.
D'autres articles connexes que j'ai écrits.
Tel qu'écrit officiellement Mitsuba2 fournit des liaisons Python très puissantes et presque toutes les fonctionnalités Peut être utilisé à partir de Python. Bien sûr, vous pouvez également l'importer sur Jupyter Notebook et effectuer divers développements de manière interactive. De plus, il est supposé qu'il fonctionnera avec PyTorch, et l'optimisation à l'aide de PyTorch peut être décrite très facilement.
** La procédure concerne Windows 10 (informations au 10 mars 2020). ** ** Le fonctionnaire a fourni du code de test de rendu Python, et mon objectif est de pouvoir l'exécuter. Cette fois, si vous avez terminé Introduction (1), je ne pense pas qu'il y ait quoi que ce soit qui vous surprenne. Je vais vous expliquer étape par étape.
Selon le fonctionnaire On dit qu'il prend en charge la version 3.6 ou supérieure, donc s'il est inférieur à cela, mettez-le à jour. ..
Tout d'abord, vous devez mettre le module mitsuba2 dans votre PATH afin qu'il puisse être importé en Python.
Il y a plusieurs façons de faire cela, mais ici nous utiliserons le script fourni par le fonctionnaire.
On suppose que les bibliothèques et les fichiers exécutables intégrés dans Introduction (1) se trouvent dans mitsuba2 \ build \ dist \
.
Il y a un fichier de commandes appelé setpath.bat
dans le répertoire racine, alors appuyez dessus à partir de l'invite de commande (cmd) (si vous utilisez Power Shell, appuyer sur bat ne renvoie pas de variables d'environnement, vous devez donc réécrire le script. ).
mitsuba2> setpath.bat
Cela passera le PATH au fichier exécutable et au module Python "dans le cmd exécuté", et Mitsuba2 sera prêt à être utilisé n'importe où. Commençons par ipython et importons 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
S'il n'y a pas d'erreur d'importation, le PATH vers le module mitsuba2 est en place. ** Il s'agit de mitsuba2, mais veuillez noter que le module à importer est "mitsuba". ** **
Maintenant, déplaçons immédiatement le code de test.
Utilisez "cmd qui a exécuté le script" pour accéder au répertoire de code d'exemple fourni par le fonctionnaire.
Le répertoire correspondant se trouve dans mitsuba2 \ docs \ examples \ 01_render_scene \
.
mitsuba2> cd docs\examples\01_render_scene\
mitsuba2\docs\examples\01_render_scene>
Render_scene.py
dans le répertoire est un exemple de code qui atteint mitsuba2 en Python pour le rendu.
Ouvrons-le avec un éditeur approprié.
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)
** Tout d'abord, déplaçons-le avant de comprendre le code. ** ** Puisqu'il n'y a pas de fichier de scène à rendre tel quel, préparez un fichier de scène. Je pense que vous avez déjà un test de rendu dans l'introduction (1), mais git clone le référentiel de données de scène d'exemple ailleurs.
git clone https://github.com/mitsuba-renderer/mitsuba-data.git
Vous pouvez spécifier le chemin du référentiel local ici, mais par souci de clarté, cette fois également mitsuba_data / scènes / cbox
pour chaque répertoire, le répertoire de code de test actuelmitsuba2 \ docs \ examples \ 01_render_scene \ Veuillez copier dans
.
Ensuite, lisez ce fichier de scène dans votre code et réécrivez-le à trois endroits seulement pour l'écrire au bon endroit.
# 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
Tout ce que vous avez à faire est de l'exécuter en python. (Veuillez pip installer numpy)
python render_scene.py
Lorsque le rendu est terminé avec succès, deux fichiers, cbox \ output.exr
et cbox \ output.jpg
, sont générés.
exr est le même que l'introduction (1), image rendue 32 bits x 3 canaux, jpg est une image compressée 8 bits x 3 canaux.
Maintenant que nous avons exécuté avec succès l'exemple de code, nous allons comprendre étape par étape le code un par un.
import os
import numpy as np
import mitsuba
J'importe un module, rien n'a changé.
# Set the desired mitsuba variant
mitsuba.set_variant('scalar_rgb')
Spécifie une variante (paramètre de rendu) de mitsuba2. Les variantes sont expliquées dans l'introduction (1). ** Ceci doit être sélectionné parmi ceux spécifiés lors de CMake. ** Si vous souhaitez effectuer le rendu avec une autre variante que vous n'avez pas construite, vous devrez revenir à CMake et reconstruire. Cette fois, nous effectuerons le rendu avec "scalar_rgb", qui est la variante la plus basique des rayons RVB (rgb) qui n'a pas de conversion SIMD (scalaire) et ne prend pas en compte le spectre et la polarisation.
from mitsuba.core import Bitmap, Struct, Thread
from mitsuba.core.xml import load_file
Importez Bitmap, Struct, Thread
depuis mitsuba.core
.
Importez également load_file
depuis mitsuba.core.xml
.
J'expliquerai chacun lors de son utilisation plus tard.
# 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)
Spécifiez le nom du fichier de scène au format xml à lire et chargez-le avec la fonction load_file ()
qui lit le fichier de scène.
Thread.thread (). File_resolver ()
résout le problème que le lien vers le fichier dans le fichier de scène est écrit comme un chemin relatif en spécifiant le nom et le chemin et en le définissant comme chemin de recherche. Sans cela, vous obtiendrez une erreur indiquant que le fichier objet est introuvable.
# Call the scene's integrator to render the loaded scene
scene.integrator().render(scene, scene.sensors()[0])
Appelez l'intégrateur (ʻintégrateur) pour rendre la scène importée. Le premier argument est la scène (
scene) et le second argument est le capteur (
scene.sensors () [0] `) qui rend (décrit dans le fichier de scène). [0] est pour que vous puissiez spécifier lequel des différents capteurs vous avez.
# 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()
Chargez le film (scene.sensors () [0] .film ()
) pour les capteurs décrits dans le fichier de scène.
Le film a pour rôle de définir la sortie des données et le post-traitement.
Définissez le nom du fichier de sortie avec film.set_destination_file
.
Développez cbox \ output.ext
avec 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')
Ce sera un traitement de développement 8 bits.
Renvoie un objet bitmap qui stocke le contenu développé avant le film avec film.bitmap (raw = True)
. ** La signification de l'argument «raw» est inconnue car il n'a pas encore été officiellement décrit. ** **
De plus, un traitement de développement 8 bits est effectué sur l'objet bitmap avec «convert». Spécifiez RVB avec Bitmap.PixelFormat.RGB
, spécifiez 8 bits avec Struct.Type.UInt8
, et appliquez le tonemap SRGB Gamma avec srgb_gamma = True
.
# 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)
Avec le même convertir
, j'obtiens une valeur RVB linéaire qui n'est pas compressée à 8 bits avec un tableau numpy.
Cela n'a rien à voir avec le résultat de sortie, mais vous pouvez voir que ** le résultat du rendu peut être facilement obtenu avec le tableau numpy. ** **
J'ai déplacé l'exemple de code et regardé le contenu du code pour comprendre comment déplacer Mitsuba2 de Python. J'espère que vous avez trouvé que le rendu de base fonctionne en Python avec une description très simple. Dès la prochaine fois, j'expliquerai comment utiliser de nouvelles fonctions comme le rendu différenciable et le rendu polarisé.
c'est tout.
Recommended Posts