これまでは物体表面での反射として完全拡散反射と完全鏡面反射のみ扱ってきた。ただ現実世界はほとんどが光沢のある表面(光沢面とする)なので、リアルな画像を生成するには光沢面のサポートが必須である。とくにぼやけたハイライトは3DCGの醍醐味(?)である…
・・・なんと前回の記事から2年が経っている。何もしていないわけではないが記事にま とめる気力がなかったのだ。少しまとまった時間ができたので久しぶりに書こうと思う。 今回のソースはこちら。 1. 素のフォトンマッピングの課題 フォトンマッピング法に…
0. 以前の記事の訂正 第8回の記事で完全拡散反射の場合のBRDF($f_r$)を下記のように示した。 が、間違いだった。shocker-0x15 さんからご指摘をいただきました。 ありがとうございます。正しい式は以下。 これにより、得られる輝度が全体的にほぼ倍になるが…
今回は寄り道 前回から半年も経ってしまった orz 前回で完全拡散面の反射まで実装した。当然次は鏡面反射、と思われたら 申し訳ないところだが、反射(と屈折)は手間がかかるので後回し。 今回は寄り道として生成画像の画質改善に取り組む。 1. 直接光は古…
DeepLearning回からだいぶ間があき、さらにレイトレーシングは1年半以上も 時間が空いてしまった。それは拡散反射でとある処理の解法で壁にぶつかって いたからだ。それが非常に簡単に解決できるとわかったのでちょっと進める ことにした。 0. 前回まで 前回…
前回で形だけは写経が完成したわけだが、最後に書いたとおりひどいスペースリークが起こって使い物にならないことがわかった。今回はスペースリークの解消に取り組もう。(前回記事ではメモリリークと書いたが、Haskell界隈では(?)スペースリークと言うようだ…
また時間が経ってしまった。畳み込み層の逆伝播のアルゴリズムを 理解するのに手間取ってしまった。。。気を取り直して、逆伝播の後半戦といこう。 1. 各層のおさらい 今回作っているプログラムは次のように11層のレイヤで画像を学習・評価している。 No. 層…
第1、2回で順伝播の処理は実現した。今回やっと「学習」処理に入る。 (それにしても時間が取れず、またしてもだいぶあいだが空いてしまった。記憶が飛んでいる) 前回作成したプログラムでは、多段のニューラルネットワークを構成したが、 その終盤には2つ…
前回に続き、CNNの順伝播処理について。前回は下準備という感じだったが、 今回は各層の処理を考よう。 なお今回の記事に限らないが、私の記事は自分自身の忘備録であることが 主目的なため、各種技術・理論については正しくないかもしれないし プログラミン…
さて、今回からは新たなネタとしてDeepLearningに取り組もう。 DeepLearningといえばすでにブームは去って、今は現実の課題に どんどん活用されている状況だ。使いやすく性能のいいツールや ライブラリがいろいろあり、ちょっと学べば簡単にその恩恵に 与る…
CPU自体は前回までで完成したので、次のネタに行ってもよかったのだが、 CPU(の実行プログラム)に与えるのがマシンコードだと、いちいち ハンドアセンブルするのが面倒くさい。 別件でパーサを書く必要がありParsecライブラリに興味を持っていたので そのう…
さあ、前回までで必要なモジュールは出揃った。今回はそれらを組み立てて 動くCPUを作ってしまおう! 一気に最終形はしんどいので少しずつピースを埋めていく感じで進めていきたい。 なお、しつこいようだがここで作っているCPUは以下の本で解説されている TD…
CPUの製作もいよいよゴールが近づいてきた。残る主要な部品は 命令デコーダ(instruction decorder)のみ。その前にCPUの全体構造を 確認しておきたい。そうすれば命令デコーダをどう作ればいいかがよく 分かると思う。次に命令デコーダを考えよう。 CPUのブロ…
今回はCPUの中でも「純粋に」計算するところ、加算器を作ろう。ALUを作る!と 行きたいところだが、残念ながらTD4(しつこいようだが下記の本で実装されるCPU) では加算器しかないので今の所は諦めよう。 1 bit 全加算器 ものの本では半加算器から説明されるよ…
前回はレジスタを作ったが、その流れでプログラムカウンタを作ろう。 なぜ「その流れ」かというと、プログラムカウンタはレジスタに少し 手を加えたものだからだ (ということを知ったのは最近なので偉そうなことは言えないが)。 便利な二項演算子 プログラム…
今回は、前回作ったD Flip Flop(以下D-FF)を使ってレジスタを作ろう。 対象のCPU(TD4)は4 bitのレジスタを2つ持っている。これを実装したいわけだ。 1 bitレジスタ 最初から複雑なものを作るのは大変なので、まず簡単なところから1 bitレジスタを 考えること…
今回こそ、CPU本体の製作に入ろう。本「CPUの創りかた」では、ROMの次に レジスタを作る流れになっている。 ただ、いきなりレジスタはしんどいので、今回はその手前のFlip Flopの話だ。 Flip Flopと状態保持 Flip Flopは順序回路の一つらしいが、状態を記憶…
今回はROMをつくろう。ROMと言っても本(CPUの創りかた)ではディップスイッチで 代用している。つまり論理回路ではない。ということで、ここでも論理回路の シミュレーションは諦め(笑)、単純にHIかLOを出すような関数を作ろうと思う。 まずはROMの概要的な…
前回は基本的な論理ゲートを作った。今回作ろうとしているCPU (TD4)は以下の本で 説明されているが、論理回路の本格的なところはROMの実装からだ。 ROMの実装においては、まずアドレスを指定するためにdecorderが必要みたいだ。 また後の章では、信号を統合…
さて今回からは、論理回路をやろう。といっても電子工作をする わけではないので、要するにシミュレータを作るということだ。 もちろん大仰なシミュレータではないが。今回唐突に論理回路を 持ち出したのは次の本の「せい」だ。 2003年発行の本で、当時から…
前回からかなり間が空いてしまった。ほとんど記事は書いていたのだが、 最後の乱数の比較がなかなかできず停滞してしまった。こういう趣味も、 きちんと時間を確保して取り組みたいものだ。。。 さて前回は曲がりなりにもなんとかフォトンマッピング法で画像…
前回、画像生成プログラムの大枠を作成した。今回はフォトンマップから各画素の輝度を 計算して画像生成までやってみよう。 各画素の処理 前回の記事でtraceScreenとした処理の実際の中身を考える。フォトンマッピング法は 光線追跡法をベースにして、(大雑…
忙しさにかまけて更新をサボってしまった。。。気を取り直して再開しよう。 前回まででフォトンマップが出来上がったので、今回からはそれを使った光線追跡の プログラムに取り組む。 処理の大枠 フォトンマップを使う以外は古典的な光線追跡のアルゴリズム…
シーン作成 前回までで、物体を定義するための準備ができた。それを用いて簡単なサンプルシーンを 作ってみる。閉じた空間でないと、せっかく放射したフォトンが無限遠に行ってしまって無駄に なるので、箱型の空間を用意しよう。これで平面が6つ。それだけ…
前回までで、光源から放射されるフォトンが生成できたので、次はそれを 追跡してフォトンマップを作ることになるが、そのためには描かれる「物体」を 準備しないといけない。 「物体」定義 次に考える処理は、メインルーチン中の次の部分だ。 photoncaches <…
光源の定義をやりなおす 前回の記事で、光源について型クラスLightを定義した上で 各種光源の型(例えば点光源PointLight)をそのインスタンスと するようにした。その後、シーン情報内で光源のリストを作ろうと した時に問題に気づいた。Haskellでは"同じ型"…
以前に書いたように、フォトンマッピング法は(1)フォトンマップの生成、 (2)レイトレーシングの二段階で画像を生成する手法だ。だから、まずは フォトンマップを作らないと始まらない。今回からそのプログラムを作っていこう。 仕様とメインルーチン まずは…
今回はテストについて書くつもりだったが、テストをいろいろ「テスト」していて なかなか確認事が多そうなので、後回しにする。そこで、前回作った Algebraモジュールをちょっといじろうと思う。 位置ベクトルと方向ベクトル 三次元ベクトルVector3を定義し…
Haskellは数学と関連があるというような話をちょくちょく見ることがある。 圏論がどうとか数学的な概念が…といったところは筆者にはわからないが、 ソース(見た目)はかなり数学っぽいと思う。実際これが一番Haskellに はまっている理由かもしれない。この…
このネタの最後に幾つか確認と改良をして完成させよう。 総当たり処理を少し改善 roundRobinは再帰で定義しているが、場合分けが格好悪い。isSameの 戻り値がBoolなところが問題か。 roundRobin x (y:ys) | isSame x y == False = roundRobin x ys | otherwi…