プログラミング」カテゴリーアーカイブ

マスコット

ぼーっとプログラミング関係のページを見ているとこんな画像を見つけました.


google先生の作ったプログラミング言語「go」の公式マスコットgordonくん.
・・・なんかウザいと思うのは僕だけでしょうか.滲み出る手書き感と,目を合わそうとしない姿勢に思わず「こっちを向け!」と言いたくなります.

それでちょっと気になったので有名所の言語のマスコットを調べてみました.
まず,有名なJavaのDukeさん.

googleで「java duke」と検索すると,ギターを引いてる姿や馬に乗っている姿,ドーナツを食べている姿などを見ることができます.さすが業界一の有名人ですね.

PHPのマスコットは「elePHPant」です.ダジャレです.

Perlのマスコットはラクダです.
オライリーのPerl本の表紙がラクダだったため,なしくずし的にマスコットになったそうです.

 

 

最後は,D言語のマスコットです.

・・・gordonよりもよっぽどウザいです.
ポーズといい,デザインといい,もうちょっと何とかならなかったんでしょうか.おもわず非公式マスコットかと思ったのですが,ちゃんとD言語の公式ページでその姿を見ることができます.
しかし,なんの脈絡もなく唐突に画像が張ってあるうえに,文章ではまったく触れられておらず名前すら不明です.ほんとうになんなんだこいつは.
D言語,公式概要ページ

他にももっといるかと思ったんですが,意外とマスコットが決まっているプログラミング言語ってのは少ないみたいです.
MySQLのイルカやらLinuxのタックスやら,ソフトウェアにはマスコットがいっぱいいるみたいですが.もっとみんなマスコットを決めるようになったら,愛着が湧くようになっていいですね.

バイラテラルフィルタ

シェーダネタ2
テスト週間の現実逃避にバイラテラルフィルタを実装してました.

バイラテラルフィルタは簡単にいうと画像のエッジは残しつつ,平滑化を行うフィルタです.
実装はt-potさんのページを参考に,いろいろいじりながら作りました.

下のような元画像に対して,デプス値によるエッジを考慮しながらガウシアンフィルタをかけます.
 

下の画像がフィルタ結果です.左がσr=1.0, 右がσr=0.2です.
σrはデプス値による重みの分散で,小さいほどエッジを残そうとします.
結果は,σr=1.0ではポットの輪郭がぼけているのに対して,σr=0.2では輪郭は残しつつポットの領域をぼかすことができています.
 

効果がわかり辛いため,チェック模様に対してフィルタをかけてみました.
左から,元画像,σd = 1.0, σd = 0.2です.σd=0.2のほうが輪郭部分で元の模様が強くでています.
  

前回作ったSSAOは遮蔽度のサンプリング数が少ないとレンダリング結果が汚くなるので,このバイラテラルフィルタをかけてやるといいらしいです.

実行ファイルソース

ssao

最近シェーダ触ってないなぁ,と思ったのでシェーダネタ
SSAO(Screen Space Ambient Occlusion)を実装して遊んでみました.

一般的なライティングでは環境光を定数とおいてしまうため,直接光のあたらない陰の部分の細かなディテールを描写することができません.SSAOは,シーンのデプス値から各ピクセルの遮蔽度を画面座標系で計算して,擬似的に環境光の遮蔽度を求めて陰の部分のディテールまで描画します.

ようするに薄暗いところまで細かく描画するよって感じです.
くわしくはぐぐってください.

まず,SSAOなしのウサギちゃんです.
首周りや脚の下側など,環境光が支配的な部分のディテールが潰れています.

SSAOありのウサギちゃんです.
陰部分の細かなディテールが描画されています.
2枚目は強めに効果をかけたものです.なんか重いですね.
 

sponzaでも試してみました.
むりやり面を三角形に変換したため,法線が少し乱れています.
  

派手な効果は得られませんが,CGでは得られにくいぼやっとした陰影がえられるためとても好きな技法です.

デッキシャッフルについて

カードゲームをやったことがある人なら分かると思うのですが,デッキのシャッフルの仕方にはいろんな方法があるものです.
そして,その中でも特に(カードゲームプレイヤに)よく使われるのがディールシャッフルだと思います.

 
ディールシャッフル(7枚切り)

ディールシャッフルはデッキをいくつかの山に順番に分配した後,また一つにまとめるというものです.(よくわからない人はwiki参照)
7つの山に分けるディールシャッフルを7枚切り,6つなら6枚切りなんていったりします.
通常,ヒンズーシャッフル(普通のシャッフル)と同時に2,3回ディールシャッフルを行いますが,この時のディールシャッフルの仕方には人によっていろんな流儀があったりします.

僕のまわりでは7枚切り,5枚切り,3枚切りの順に行う「素数切り」や7,6,5の順に行う「ナムコ切り」なんかがいました.(ちなみに僕は765切り派です)ほかにも654切り,876切りなどいろんな人がいたのですが,結局どの切り方が最もランダムにデッキを混ぜることができるのか気になったので検証してみました.

※ヒンズーシャッフルは定義が難しかったので,ディールシャッフルのみを対象にして計算しました.

 
まず,デッキを60枚とし,初期状態をc[60] = { 0, 1, 2, … , 59 }という配列で表します.
その後,ディールシャッフルを行った状態を前の状態から生成します.例えば4枚切りならc[60] = { 0, 4, 8, … }といった具合です.
あとはランダム差を評価するだけですが,評価は以下の式で行いました.

前後5枚のカード番号と自身のカード番号の差の絶対値の総和をとっています.たぶん順番にカードが並んでいる時が最小で,ある程度ランダムなほど数値が大きくなると思います.
本当は,もっと適切な式を用意したかったのですがランダムさの評価はなんだかとっても難しかったので,とりあえず簡単な式を使って見ました.

そんなこんなで計算結果は以下のようになりました.

初期状態:3380
343番,543切り:3380
342番,453切り:3380
341番,345切り:3380

5番,866切り:14032
4番,367切り:14172
3番,637切り:14172
2番,798切り:14316
1番,555切り:14420

デッキ枚数に対して素な数で切った方が良いと思っていたのですが,なんと555切りが最もランダムという結果となりました.
が,ちょっとあやしいですね.ランダムさの評価式による特性が影響しているように思うのですが…

その他の切り方に関しては
127番,876切り:12712
161番,765切り:12536
262番,753切り:11912
336番,654切り:6320
となりました.

これだけじゃつまらないのでついでに可視化してみました.
カード番号0を輝度0, カード番号59を輝度1として画像にして見ました.

初期状態:
555切り:
798切り:
637切り:
876切り:
765切り:
753切り:

やっぱり,555切りは規則的な並びになってるようです.パッと見た感じでは876切りが良い感じでしょうか?

検証の結果,555切り,798切り,637切りなどが高評価になりましたが,評価関数をもう少し選びなおす必要がありそうです.
もっと良い評価関数を知ってる人はぜひ,教えてください.

 

追記
風呂に入りながらのんびり考えてみたら,ランダムさじゃなくて均一に混ざっているかという観点でいえば,今回の評価関数でも問題ない気がしてきました.
ただ,555切りは均一すぎて積み込みを疑われかねないレベルなので,ヒンズーシャッフルを織りまぜながら使ったほうがいいと思います.