Haskellでいってみよう

日曜プログラマにも満たないレベルでもHaskellで何かソフトウェアを作りたい!

graphics

レイトレーシング(14): 光沢面にトライ

これまでは物体表面での反射として完全拡散反射と完全鏡面反射のみ扱ってきた。ただ現実世界はほとんどが光沢のある表面(光沢面とする)なので、リアルな画像を生成するには光沢面のサポートが必須である。とくにぼやけたハイライトは3DCGの醍醐味(?)である…

レイトレーシング(13): Progressive Photon Mapping (ただし本家ではない)

・・・なんと前回の記事から2年が経っている。何もしていないわけではないが記事にま とめる気力がなかったのだ。少しまとまった時間ができたので久しぶりに書こうと思う。 今回のソースはこちら。 1. 素のフォトンマッピングの課題 フォトンマッピング法に…

レイトレーシング(12): 集光模様!

0. 以前の記事の訂正 第8回の記事で完全拡散反射の場合のBRDF($f_r$)を下記のように示した。 が、間違いだった。shocker-0x15 さんからご指摘をいただきました。 ありがとうございます。正しい式は以下。 これにより、得られる輝度が全体的にほぼ倍になるが…

レイトレーシング(11): 画質向上策2点

今回は寄り道 前回から半年も経ってしまった orz 前回で完全拡散面の反射まで実装した。当然次は鏡面反射、と思われたら 申し訳ないところだが、反射(と屈折)は手間がかかるので後回し。 今回は寄り道として生成画像の画質改善に取り組む。 1. 直接光は古…

レイトレーシング(10): 拡散反射と面光源

DeepLearning回からだいぶ間があき、さらにレイトレーシングは1年半以上も 時間が空いてしまった。それは拡散反射でとある処理の解法で壁にぶつかって いたからだ。それが非常に簡単に解決できるとわかったのでちょっと進める ことにした。 0. 前回まで 前回…

レイトレーシング(9): フィルタ、乱数などで抗ってみる

前回からかなり間が空いてしまった。ほとんど記事は書いていたのだが、 最後の乱数の比較がなかなかできず停滞してしまった。こういう趣味も、 きちんと時間を確保して取り組みたいものだ。。。 さて前回は曲がりなりにもなんとかフォトンマッピング法で画像…

レイトレーシング(8): 輝度推定による画像生成

前回、画像生成プログラムの大枠を作成した。今回はフォトンマップから各画素の輝度を 計算して画像生成までやってみよう。 各画素の処理 前回の記事でtraceScreenとした処理の実際の中身を考える。フォトンマッピング法は 光線追跡法をベースにして、(大雑…

レイトレーシング(7): 光線追跡処理の大枠

忙しさにかまけて更新をサボってしまった。。。気を取り直して再開しよう。 前回まででフォトンマップが出来上がったので、今回からはそれを使った光線追跡の プログラムに取り組む。 処理の大枠 フォトンマップを使う以外は古典的な光線追跡のアルゴリズム…

レイトレーシング(6): やっとフォトン追跡

シーン作成 前回までで、物体を定義するための準備ができた。それを用いて簡単なサンプルシーンを 作ってみる。閉じた空間でないと、せっかく放射したフォトンが無限遠に行ってしまって無駄に なるので、箱型の空間を用意しよう。これで平面が6つ。それだけ…

レイトレーシング(5): 物体の定義

前回までで、光源から放射されるフォトンが生成できたので、次はそれを 追跡してフォトンマップを作ることになるが、そのためには描かれる「物体」を 準備しないといけない。 「物体」定義 次に考える処理は、メインルーチン中の次の部分だ。 photoncaches <…

レイトレーシング(4): フォトンの生成

光源の定義をやりなおす 前回の記事で、光源について型クラスLightを定義した上で 各種光源の型(例えば点光源PointLight)をそのインスタンスと するようにした。その後、シーン情報内で光源のリストを作ろうと した時に問題に気づいた。Haskellでは"同じ型"…

レイトレーシング(3): フォトンマップ生成の大枠を考える(ついでに光源も)

以前に書いたように、フォトンマッピング法は(1)フォトンマップの生成、 (2)レイトレーシングの二段階で画像を生成する手法だ。だから、まずは フォトンマップを作らないと始まらない。今回からそのプログラムを作っていこう。 仕様とメインルーチン まずは…

レイトレーシング(2): `Algebra`モジュールをいじる

今回はテストについて書くつもりだったが、テストをいろいろ「テスト」していて なかなか確認事が多そうなので、後回しにする。そこで、前回作った Algebraモジュールをちょっといじろうと思う。 位置ベクトルと方向ベクトル 三次元ベクトルVector3を定義し…

レイトレーシング(1): バージョン1の定義、ベクトル演算

Haskellは数学と関連があるというような話をちょくちょく見ることがある。 圏論がどうとか数学的な概念が…といったところは筆者にはわからないが、 ソース(見た目)はかなり数学っぽいと思う。実際これが一番Haskellに はまっている理由かもしれない。この…

同一画像検索(6): 改良して完成

このネタの最後に幾つか確認と改良をして完成させよう。 総当たり処理を少し改善 roundRobinは再帰で定義しているが、場合分けが格好悪い。isSameの 戻り値がBoolなところが問題か。 roundRobin x (y:ys) | isSame x y == False = roundRobin x ys | otherwi…

同一画像検索(5): 同一判定方法の再考

前回簡易版を作ってみたが、縮小した画像が「同一」と見做されなかった。 今回はこれにどう対処するか検討してみる。 この問題は、各画像を4x4解像度に変換した結果(=fingerprint)を取った時に、 元画像と縮小画像とで微妙に異なるのが原因だった。 簡易版は…

同一画像検索(4): 簡易版を作ってみた

これまでの確認などを踏まえ、今回は簡易版を作ろう。仕様では4x4解像度の画像比較をして 一致したら次に16x16解像度でもう少し詳細に比較する、としているところ、まずは4x4解像度での 比較だけで作ってみようと思う。 最初に、「外枠」で示したfindSame関…

同一画像検索(3): 再帰のKAIZEN

前回の記事で、同一キーのファイルを集める処理に再帰を使った関数tomapを示した。 やりたいのはListを与えて最終的にMap(連想配列)が欲しいだけなのだが、 引数にもMapが入っていて気持ち悪い感じだった。 そのあと、いろいろ記事を見たり本を読んだりして…

同一画像検索(2):Finder moduleのための確認

前回はダミーのFinderモジュールで、とりあえず外側を作ったので、 今回からFinderの作成をすすめたい。ただ、その前に幾つか基本的な ところを確認しておきたい。 同一の画像を見つけるやり方は前回も書いた通り解像度4x4に変換して その情報が同じものをグ…

同一画像検索(1):仕様と外枠作り

前回からかなり時間が空いてしまったが…気を取り直して進めよう。 作りたいのは複数の画像ファイルの中から同じ画像を抽出するプログラムだった。 基本的な仕様は次の通りとする。 引数で調査したいディレクトリを指定する ディレクトリ内にあるJPEGファイル…

開発環境の整備とプロジェクトディレクトリ

ちゃんとしたプロダクトを作るにあたり、まずは開発環境を整えないといけない。 ソース管理は当然なので、今ならgithubが妥当だろう。早速ユーザ登録して、 新規リポジトリを開始する。この辺の詳しいところは、以下の書籍を参考にした。 GitHub実践入門 ~Pu…

簡易cat (2)

ファイル内容を表示するだけでは寂しいので、コマンドラインに オプションを追加してみる。ややこしいのは大変なので、先頭に 行番号を表示する -n モドキだけ。 -n オプションがある場合は各行の表示をする時に番号を付加する。 行番号はいわゆる「無限リス…

簡易cat - コマンドライン引数

はじめに、このブログはHaskellの入門記事でも何でもないので、その辺りはご期待には添えないのであらかじめお断りしておくことにする。単に、私がHaskellで何かしらソフトウェアを作るということのモチベーションを維持するためであり、またその過程を記録…

まずは "Hello, World!" から

実用的なプログラムを作ることが目的なので、実行ファイルを 作成できなくては始まらない。Haskellの本だと対話環境を使った リスト操作や再起などの説明が多いが、そうではなくてまずは コンパイルしてみる。お決まりの"Hello, World!"でも書いてみる。 (Gr…

Haskellコンパイラを入れる

どうやらHaskellのコンパイラとしてはGHCがメジャーということらしい。もろもろライブラリも使いたいのでHaskell Platformを入れるのがよいそうで。自宅はMacで、パッケージ管理はHomebrewを使っている。 $ brew install haskell-platform Warning: haskell-…

何をしようか?

このところ流行っていそうな関数プログラミングとやらに興味が湧いてきて雑誌記事やwebを読みまくってる。どうも個人的にはHaskellの言語特性もさることながら簡潔な文法にえらく関心してしまい、何とかHaskellでプログラムを書けるようになれないか、とむず…