{ "cells": [ { "cell_type": "markdown", "metadata": { "tags": [] }, "source": [ "# Deep dive into a BSDF" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Overview\n", "\n", "As you have probably already discovered, Mitsuba 3 can do much more than rendering. In this tutorial we will show how to instantiate a BSDF plugin using Python dictionaries and plot its distribution function using `matplotlib`.\n", "\n", "
\n", "\n", "🚀 **You will learn how to:**\n", "\n", "\n", " \n", "
\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Setup\n", "\n", "Of course, let's start with the usual Python imports! As emphasized in previous tutorials, Mitsuba requires a specific variant to be set before performing any other imports or computations. For this tutorial, we are going to use one of the JIT vectorized variant of the system. This will allow us to write code as if it was operating on normal scalar values, and have it run on arbitrary-sized arrays of values on the CPU or GPU." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import drjit as dr\n", "import mitsuba as mi\n", "\n", "mi.set_variant('llvm_ad_rgb')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Instantiating a BSDF\n", "\n", "One easy way to instanciate Mitsuba objects (e.g., [Shape][1], [BSDF][2], ...) is using the [load_dict][3] function. This function takes as input a Python `dict` following a similar structure to the XML scene description and instantiates the corresponding plugin. You can learn more about the specific format of this `dict` by reading the dedicated section in the [documentation][4].\n", "\n", "In this scenario, we want to construct a [roughconductor BSDF][5] with a high roughness value and a GGX microfacet distribution.\n", "\n", "[1]: https://mitsuba.readthedocs.io/en/latest/src/generated/plugins_shapes.html\n", "[2]: https://mitsuba.readthedocs.io/en/latest/src/generated/plugins_bsdfs.html\n", "[3]: https://mitsuba.readthedocs.io/en/latest/src/api_reference.html#mitsuba.load_dict\n", "[4]: https://mitsuba.readthedocs.io/en/latest/src/key_topics/scene_format.html#scene-python-dict-format\n", "[5]: https://mitsuba.readthedocs.io/en/latest/src/generated/plugins_bsdfs.html#rough-conductor-material-roughconductor" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "bsdf = mi.load_dict({\n", " 'type': 'roughconductor',\n", " 'alpha': 0.2,\n", " 'distribution': 'ggx'\n", "})" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Vectorized evaluation of the BSDF\n", "\n", "We will now evaluate this BSDF for a whole array of directions at once, leveraging the enabled vectorize backend. Similarly to working on `numpy` arrays, we use DrJit routines to perform array-based arithmetics.\n", "\n", "For instance, here we start by defining a function to map from spherical and Euclidean coordinates." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "def sph_to_dir(theta, phi):\n", " \"\"\"Map spherical to Euclidean coordinates\"\"\"\n", " st, ct = dr.sincos(theta)\n", " sp, cp = dr.sincos(phi)\n", " return mi.Vector3f(cp * st, sp * st, ct)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can then use this function to generate a set of directions to evaluate the BSDF with." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "# Create a (dummy) surface interaction to use for the evaluation of the BSDF\n", "si = dr.zeros(mi.SurfaceInteraction3f)\n", "\n", "# Specify an incident direction with 45 degrees elevation\n", "si.wi = sph_to_dir(dr.deg2rad(45.0), 0.0)\n", "\n", "# Create grid in spherical coordinates and map it onto the sphere\n", "res = 300\n", "theta_o, phi_o = dr.meshgrid(\n", " dr.linspace(mi.Float, 0, dr.pi, res),\n", " dr.linspace(mi.Float, 0, 2 * dr.pi, 2 * res)\n", ")\n", "wo = sph_to_dir(theta_o, phi_o)\n", "\n", "# Evaluate the whole array (18000 directions) at once\n", "values = bsdf.eval(mi.BSDFContext(), si, wo)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Plotting the results\n", "\n", "Dr.Jit arrays of any flavour can easily be converted to an array type of other mainstream libraries, such as `numpy`, `PyTorch`, `JAX` and `TensorFlow`. For more detailed information on this, take a look at the extensive [drjit documentation][1].\n", "In our case we are going to convert our drjit array to a numpy array.\n", "\n", "[1]: https://drjit.readthedocs.io/en/master/" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "values_np = np.array(values)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can now use our favourite plotting library to visualize the BSDF distribution (here we use `matplotlib`)." ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "nbsphinx-thumbnail": {}, "tags": [] }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "\n", "# Extract red channel of BRDF values and reshape into 2D grid\n", "values_r = values_np[:, 0]\n", "values_r = values_r.reshape(2 * res, res).T\n", "\n", "# Plot values for spherical coordinates\n", "fig, ax = plt.subplots(figsize=(8, 4))\n", "\n", "im = ax.imshow(values_r, extent=[0, 2 * np.pi, np.pi, 0], cmap='jet')\n", "\n", "ax.set_xlabel(r'$\\phi_o$', size=10)\n", "ax.set_xticks([0, dr.pi, dr.two_pi])\n", "ax.set_xticklabels(['0', '$\\\\pi$', '$2\\\\pi$'])\n", "ax.set_ylabel(r'$\\theta_o$', size=10)\n", "ax.set_yticks([0, dr.pi / 2, dr.pi])\n", "ax.set_yticklabels(['0', '$\\\\pi/2$', '$\\\\pi$']);" ] }, { "cell_type": "markdown", "metadata": { "tags": [] }, "source": [ "## See also\n", "\n", "- [mitsuba.load_dict()][1]\n", "- [mitsuba.BSDF.eval()][2]\n", "\n", "[1]: https://mitsuba.readthedocs.io/en/latest/src/api_reference.html#mitsuba.load_dict\n", "[2]: https://mitsuba.readthedocs.io/en/latest/src/api_reference.html#mitsuba.BSDF.eval" ] } ], "metadata": { "file_extension": ".py", "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.12" }, "metadata": { "interpreter": { "hash": "31f2aee4e71d21fbe5cf8b01ff0e069b9275f58929596ceb00d14d90e3e16cd6" } }, "mimetype": "text/x-python", "name": "python", "npconvert_exporter": "python", "pygments_lexer": "ipython3", "version": 3 }, "nbformat": 4, "nbformat_minor": 4 }