{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "python_gpu_ray_tracing.ipynb",
"provenance": [],
"collapsed_sections": [],
"authorship_tag": "ABX9TyNV/igI8kF+qgbFbq95/lRN",
"include_colab_link": true
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"
"
]
},
{
"cell_type": "code",
"metadata": {
"id": "OFGQyAqQSHqR",
"colab_type": "code",
"outputId": "6b2a5953-4505-49ca-cd1b-44c87b7988bc",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 139
}
},
"source": [
"!curl https://colab.chainer.org/install | CUPY_VERSION=\"==8.0.0b2\" sh -"
],
"execution_count": 1,
"outputs": [
{
"output_type": "stream",
"text": [
" % Total % Received % Xferd Average Speed Time Time Time Current\n",
" Dload Upload Total Spent Left Speed\n",
"\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\r100 1580 100 1580 0 0 3457 0 --:--:-- --:--:-- --:--:-- 3449\r100 1580 100 1580 0 0 3457 0 --:--:-- --:--:-- --:--:-- 3449\n",
"********************************************************************************\n",
"GPU is not enabled!\n",
"Open \"Runtime\" > \"Change runtime type\" and set \"Hardware accelerator\" to \"GPU\".\n",
"********************************************************************************\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "AjgpEZAY-Q0a",
"colab_type": "code",
"colab": {}
},
"source": [
"from PIL import Image\n",
"from functools import reduce\n",
"import numpy as np\n",
"import numpy as onp\n",
"import time\n",
"import numbers\n",
"import math\n",
"import matplotlib.pyplot as plt\n",
"%matplotlib inline\n"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "6YVroW7J_rXK",
"colab_type": "code",
"colab": {}
},
"source": [
"def extract(cond, x):\n",
" if isinstance(x, numbers.Number):\n",
" return x\n",
" else:\n",
" return np.extract(cond, x)\n",
"\n",
"class vec3():\n",
" def __init__(self, x, y, z):\n",
" (self.x, self.y, self.z) = (x, y, z)\n",
" def __mul__(self, other):\n",
" return vec3(self.x * other, self.y * other, self.z * other)\n",
" def __add__(self, other):\n",
" return vec3(self.x + other.x, self.y + other.y, self.z + other.z)\n",
" def __sub__(self, other):\n",
" return vec3(self.x - other.x, self.y - other.y, self.z - other.z)\n",
" def dot(self, other):\n",
" return (self.x * other.x) + (self.y * other.y) + (self.z * other.z)\n",
" def __abs__(self):\n",
" return self.dot(self)\n",
" def norm(self):\n",
" mag = np.sqrt(abs(self))\n",
" return self * (1.0 / np.where(mag == 0, 1, mag))\n",
" def components(self):\n",
" return (self.x, self.y, self.z)\n",
" def extract(self, cond):\n",
" return vec3(extract(cond, self.x),\n",
" extract(cond, self.y),\n",
" extract(cond, self.z))\n",
" def place(self, cond):\n",
" r = vec3(np.zeros(cond.shape), np.zeros(cond.shape), np.zeros(cond.shape))\n",
" np.place(r.x, cond, self.x)\n",
" np.place(r.y, cond, self.y)\n",
" np.place(r.z, cond, self.z)\n",
" return r\n",
"rgb = vec3"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "nwS2eSz3_yL5",
"colab_type": "code",
"colab": {}
},
"source": [
"(w, h) = (900, 900) # Screen size\n",
"#point lights\n",
"lights = [\n",
" (vec3(5, 5, -10),rgb(0.2,0.1,0.2)),\n",
" (vec3(10, 5, -10),rgb(0.1,0.1,0.1)),\n",
" (vec3(10, 5, -30),rgb(0.1,0.1,0.1))\n",
"]\n",
"eye_pos = vec3(0, 0.35, -1) # Eye position\n",
"FARAWAY = math.inf # an implausibly huge distance"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "Dhsb7hwk_y8v",
"colab_type": "code",
"colab": {}
},
"source": [
"def raytrace(O, D, scene, bounce,lights):\n",
" # O is the ray origin, D is the normalized ray direction\n",
" # scene is a list of Sphere objects (see below)\n",
" # bounce is the number of the bounce, starting at zero for camera rays\n",
"\n",
" distances = [s.intersect(O, D) for s in scene]\n",
" nearest = reduce(np.minimum, distances)\n",
" color = rgb(0, 0, 0)\n",
" for (s, d) in zip(scene, distances):\n",
" hit = (nearest != FARAWAY) & (d == nearest)\n",
" if np.any(hit):\n",
" dc = extract(hit, d)\n",
" Oc = O.extract(hit)\n",
" Dc = D.extract(hit)\n",
" cc = s.light(Oc, Dc, dc, scene, bounce, lights)\n",
" color += cc.place(hit)\n",
" return color\n",
"\n",
"class Sphere:\n",
" def __init__(self, center, r, diffuse, mirror = 0.5):\n",
" self.c = center\n",
" self.r = r\n",
" self.diffuse = diffuse\n",
" self.mirror = mirror\n",
"\n",
" def intersect(self, O, D):\n",
" b = 2 * D.dot(O - self.c)\n",
" c = abs(self.c) + abs(O) - 2 * self.c.dot(O) - (self.r * self.r)\n",
" disc = (b ** 2) - (4 * c)\n",
" sq = np.sqrt(np.maximum(0, disc))\n",
" h0 = (-b - sq) / 2\n",
" h1 = (-b + sq) / 2\n",
" h = np.where((h0 > 0) & (h0 < h1), h0, h1)\n",
" pred = (disc > 0) & (h > 0)\n",
" return np.where(pred, h, FARAWAY)\n",
"\n",
" def diffusecolor(self, M):\n",
" return self.diffuse\n",
"\n",
" def light(self, O, D, d, scene, bounce, lights):\n",
" # Ambient\n",
" color = rgb(0.0,0.0,0.0)\n",
" for L in lights:\n",
" color += L[1]\n",
" M = (O + D * d) # intersection point\n",
" N = (M - self.c) * (1. / self.r) # normal\n",
" toL = (L[0] - M).norm() # direction to light\n",
" toO = (eye_pos - M).norm() # direction to ray origin\n",
" nudged = M + N * .0001 # M nudged to avoid itself\n",
"\n",
" # Shadow: find if the point is shadowed or not.\n",
" # This amounts to finding out if M can see the light\n",
" light_distances = [s.intersect(nudged, toL) for s in scene]\n",
" light_nearest = reduce(np.minimum, light_distances)\n",
" seelight = light_distances[scene.index(self)] == light_nearest\n",
"\n",
" # Lambert shading (diffuse)\n",
" lv = np.maximum(N.dot(toL), 0)\n",
" color += self.diffusecolor(M) * lv * seelight\n",
"\n",
" # Reflection\n",
" if bounce < 1:\n",
" rayD = (D - N * 2 * D.dot(N)).norm()\n",
" color += raytrace(nudged, rayD, scene, bounce + 1,lights) * self.mirror\n",
"\n",
" # Blinn-Phong shading (specular)\n",
" phong = N.dot((toL + toO).norm())\n",
" color += rgb(1, 1, 1) * np.power(np.clip(phong, 0, 1), 50) * seelight\n",
" return color\n",
"\n",
"class CheckeredSphere(Sphere):\n",
" def diffusecolor(self, M):\n",
" checker = ((M.x * 2).astype(int) % 2) == ((M.z * 2).astype(int) % 2)\n",
" return self.diffuse * checker\n",
"\n",
"scene = [\n",
" Sphere(vec3(.75, .1, 1), .6, rgb(0, 0, 1)),\n",
" Sphere(vec3(-.75, .1, 2.25), .6, rgb(.5, .223, .5)),\n",
" Sphere(vec3(-2.75, .1, 3.5), .6, rgb(1, 1, .184)),\n",
" Sphere(vec3(-4.75, .1, 3.5), .6, rgb(1, .572, .184)),\n",
" CheckeredSphere(vec3(0,-99999.5, 0), 99999, rgb(.75, .75, .75), 0.25),\n",
" ]\n"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "EOzcJ23nBd0m",
"colab_type": "code",
"outputId": "083765e7-c0c2-48bf-b4c3-dbc1a6244db0",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 35
}
},
"source": [
"r = float(w) / h\n",
"# Screen coordinates: x0, y0, x1, y1.\n",
"S = (-1, 1 / r + .25, 1, -1 / r + .25)\n",
"x = np.tile(np.linspace(S[0], S[2], w), h)\n",
"y = np.repeat(np.linspace(S[1], S[3], h), w)\n",
"\n",
"t0 = time.time()\n",
"Q = vec3(x, y, 0)\n",
"color = raytrace(eye_pos, (Q - eye_pos).norm(), scene,bounce=0,lights=lights)\n",
"print (\"Took\", time.time() - t0)"
],
"execution_count": 10,
"outputs": [
{
"output_type": "stream",
"text": [
"Took 2.504704475402832\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "L6qKKA3IAIHK",
"colab_type": "code",
"outputId": "c3658a71-4d61-4a60-dbc0-eb141081d816",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 287
}
},
"source": [
"pixels = [Image.fromarray((255 * onp.clip(c, 0, 1).reshape((h, w))).astype(onp.uint8), \"L\") for c in color.components()]\n",
"pixels = Image.merge(\"RGB\", pixels)\n",
"plt.imshow(onp.array(pixels))"
],
"execution_count": 11,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
""
]
},
"metadata": {
"tags": []
},
"execution_count": 11
},
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"tags": [],
"needs_background": "light"
}
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "eS8pKM7BAfRl",
"colab_type": "code",
"colab": {}
},
"source": [
""
],
"execution_count": 0,
"outputs": []
}
]
}