減量開始。

こんにちわ、Pocolです。
みなさん、元気にお過ごしですか?

私は,つい2日前に健康診断の2次検診で脂質異常症の検査にひっかかってしまい。
「脂肪肝ですね。」とお医者に言われてしまいました。
「このままだと肝硬変になります。血管中にプラークがたまり心筋梗塞になる恐れもあります。」

我が家は,父親が脳梗塞と心筋梗塞のどちらもなったことがあり,どうなってしまうのかというのは間近で見ていたので,『マジでこのままだと死ぬ』という生命の危機感を覚えて,本格的に減量を開始することにしました。
主に不健康の原因は内臓脂肪がついてしまっていることにあるそうで,減量をして内臓脂肪を減らさないと数値は正常にならないと診察で教えてもらいました。
正月の時点で,72.4kg程度体重がありました。流石にヤバいと思い,少しずつ食事量を減らして診察時点の朝の体重が,68kg。
4kgはダイエットに成功しているのですが,残念ながらこれは最初の健康診断時(昨年の10月時点)の体重に戻ったに過ぎません。
ここから標準体重の59.8kgを目指して,9kg削る必要があります。
なんともハードですが,削らないと死ぬだけなので,やらないという選択肢は既に消滅している。

ここ2週間ほど前から断酒を初めて,1週間ほど前からカロリー制限と糖質制限を始めました。
徐々に効果が表れ始めていて,今日お風呂上りに測ったら66.8kgでようやく66kg台に突入して,残り7kgです。

減量し始めて気づいたのですが,プロファイルして大きく削れそうなところから削っていくというやり方が,どことなくプログラムの最適化に似ています。
そんなわけで,ちょこちょこダイエット日記を書いていこうかなって思っています。

道徳の授業

こんにちわ、Pocolです。
今日は私が最近取り組んでいる内容の一つをご紹介しようと思います。

私が小学生ぐらいの頃に,学校の授業で「道徳」という科目があったのですが,自分は結構話の内容が面白くて好きだったなーとふと思い出しまして,こういうのってあんまり会社では教育してくれないよなって思って,実験的にちょっとやってみようかと思って最近新人さんを捕まえて勝手にやってます。
当然、自分の昔話しても単なる「老害」になってしまうし,全く意味が無いし,自分だったら「お前の話聞いても面白くないよ」と思ってしまうので,これはダメ。
また,よく社会人になりたての頃にやる研修とかでやるような内容をやっても,対して業務に役に立たないことが多いので,違う内容をやろうと思いました。
…で,色々と考えて面白く学べる内容かつ業務内容にも効きそうな内容をやると良いんじゃないかと。毎年CEDECとかで基調講演とかやってますけど,自分はああいうのが結構面白くて好きな人間でして,ガイアの夜明けとかカンブリア宮殿,がっちりマンデーとかが好きなので,そういうテイストの動画を見てもらって,実績ある人から開発で心がけたこととか,作る際に気を付けたこと,どうやってアイデアが出てきたか?などを知ってほしいなと思って,最近色々と動画を漁って,その動画を見て気づきを得てもらう。
…というようなことをやっています。

初回にやったのは,任天堂の山内溥さんの話を見てもらいました。
NHKアーカイブス あの人に会いたい File.494 山内溥

結構色々と面白い話があって,その中の一つに

今まで過去に売れた そういうゲームのいいところだけを取ってきてね
面白い箇所だけ寄せ集めてきてね
それでまとめてしまう
ということをやる人もいますけど
そんなことをしてもユーザーは知っているわけですよ
ユーザーが求めているのは独創的な楽しさ面白さをもとめているわけです 絶えず

という言葉があって,「確かになぁ!」と自分は思いました。
自分がユーザーだとしたら一度見せられたものを見ても新鮮さは無いわけです。もっと言えば,飽きちゃう。飽きちゃうから面白くない。

あと面白いと思ったのは,次のような話もありました。

大衆が買える価格でないと広がらないんですよ
16であろうと32ビットであろうと64ビットであろうとユーザーは関係がないんです ユーザーは
ゲームというのはインタラクティブで遊んで楽しい面白いものなんです
映像がすごい 音声がすごいと言ったって
遊んだら全然面白くも楽しくもなかったら
ユーザーはどうするんですか こんなもん

買いません ユーザーは絶対に。

…まぁ、ものすごく当たり前のことを言っていますよね。
でも,正直なところ開発する際に,こういう当たり前のことを忘れてしまっているな,と自分は気づかされました。

こういう動画を見て感じることは人それぞれ違うと思うんです。
それを動画を見た後に感想会みたいな感じで言い合って,共有するということをやっています。
ただ,動画見るだけども面白いですけども,人それぞれ解釈の仕方のも違うので,色々な新しい考え方も取り込めて面白いんじゃないかと思ってやっています。

この「道徳の授業」がどういう効果をもたらすかは未知ですが…
少なくとも,人が何を面白いと思って開発しているのか,どういう思いを持って開発しているのかについては「知らない」よりは「知っていた方がよいことがある」という信念をもってやっていますし,単純に自分が面白いというものを推し活しているだけなのですが,今後何かいいことがあるといいなとワクワクしながら取り組んでいます。
何か良いことが起こったら,皆さんにも共有したいと思います。

Character Rendering 研究メモ

私的な研究メモです。

以前からどうも眼球がリアルに見えなくて困っています。
特に困っている点としては,

  • 眼球としての丸みが分かるライティングが出来ていない
  • 透明感のあるライティングが出来ていない

という2点です。

透明感のあるライティングについては,一応アイデアがあって下記の画像を参照。上側が元絵で,下側が加工画になっています。

何が変わったかというとGimpでガウスブラーがかかっているだけです。
このことから,テクスチャがはっきり見えすぎてしまうとCGっぽくなることが分かるので,虹彩部分に対してもSSSブラーを適用した方がよさそうな感じ。
過去試したことはあるのですが,皮膚と同じSSSプロファイルを適用してしまうと赤味がかってしまうので,SSSプロファイルのパラメータは別途設定した方がよさそう。
ゼリー状っぽいパラメータを設定するのが感覚的にはよさそう。

次に,皮膚のライティングについて。
上記の実写をみると,鼻の頭のあたりや頬骨,あごのあたりや下唇のスペキュラーハイライトの出方が特徴的で,CG側だとうまくそれが再現できていない。
鼻のあたりは,実写の方は結構鋭く光っているが,CG側は結構鈍い感じに出ている。一方,下唇やあごの部分は実写側は柔らかく出ているのに対して,CG側はきつく出すぎているので,スペキュラーのBRDFは見直しした方がよさそう。
ライティングはももう少しGI的な要素が載らないと実写に近づかない気がする。下あご側面からエラにかけての光の出方に違いが見て取る。


このラフネスに対して,Toksvigで法線から作成したラフネスを加えている。

眼球中心だが,人間は非対称で中心に寄りやすいという統計結果がでているらしく,それを再現するためかKappa angleというものが実装されている。

噂によるととあるステルスアクションゲームでもそうなるようにモデリングされていたとかされていないとか。

今年のGDCでCallist ProtocolのCharacter Renderingについてのプレゼンがあるようなので,あとで要チェック。
https://schedule.gdconf.com/session/the-character-rendering-art-of-the-callisto-protocol/893232

GPU Architecture & Compute Shader

いつもメモし忘れて,ツイートを見失うのでメモ。
Carlos Fuentes 氏によるGPU Architecture & Compute Shaderというスライドが非常にわかりやすくておススメです。

移動先アカウント

こんにちわ、Pocolです。
以前に書いたようにTwitterから移行することを決めました。
…というのも,ついにTwitterでグラフィックス関係のツイートが全く流れず日本語のどうでもいい内容しか流れなくなってしまったので,Mastodonにアカウントを作成することにしました。
アカウントは @project_asura@mastodon.gamedev.place です。
しばらくは,Twitterも使いつづけます。

Twitterの移行先

こんにちわ、Pocolです。
Twitterでサードパーティアプリが禁止されて,いよいよ終わりの始まりかぁと思ったので,Twitterの移行先を検討中です。
現状の第1候補は,私がフォローしているしている人達が多くいる https://mastodon.gamedev.place/public/local を移行先として検討中です。
いくつかルールがあって,その中の一つにEUの法律に関するものがあり,EUの法律は全く知らないため登録に躊躇している状態です。
とりあえず,しばらくの間はこのBlogを退避先として利用しようと思います。
移行を決めたら,また投稿すると思うのでヨロシクです。

レイトレ合宿8に参加してきました!

こんにちわ。Pocolです。
先週,レイトレ合宿8に参加してきました!

今年の開催地は沖縄ということで,台風11号が迫る中参加してきました。
台風が来ているせいで,まず現地に行くのが通常よりも難度が高いw。

金曜日到着の前泊組は問題なかったそうなのですが,自分は土曜日到着組だったので,
羽田空港から出発する便が,条件付き飛行になってました。

空港でも,「機長が着陸が難しいと判断した場合は羽田空港に引き返す恐れがありますので,予めご注意ください。」とアナウンスされている状況。
台風だからだと思うのですが,乗客も非常に少なかったです。でも,こんな中でも乗る人意外といるんだなと思ってびっくりしました。

現地についた瞬間はあまり雨が降っていませんでした。

しかし,タクシー載るころには豪雨状態。
さらに風も強くなってきたので,傘だと風でひっくり返ってしまってダメですね。
レインコートも持って行ったのですが,山用のやつだったので,夏だと暑いですし,上下セパレートしているので装着も面倒で結局着ずじまいでした。
ポンチョみたいな簡単に着れるやつを今後常備しておこうと思います。

さて、今年のレイトレ合宿の宿はVilla VALISOAで,これが滅茶苦茶良かったです。
詳細はWebページ見て欲しいのですが,写真詐欺も無く本当にこのままで,非常に綺麗でした。水着を持っていけばジャグジーやプールも入れます。
バスとトイレ・洗面所が隣同士なので,誰かが風呂に入っている最中はトイレを利用できなくなるというのが唯一の不便なところでした。2階にもバス・トイレ・洗面所があるので,そちらを利用することで回避も可能です。

ちなみに1階はガラス張りで外が見えます。ブラインドもついているので,下げた方がいいです(浴室隣の部屋から見えてしまいます)。
朝食等は2階にキッチンがついているので,各自で作るという感じのスタイルだそうです。食器等も一式揃っています。

2階から見える景色も非常に良かったです。台風が来ていなければ素晴らしい景色だったんだろうなと想像されます。
また,沖縄に行く機会があれば,再度利用したいなと思いました。
宿の話はこれぐらいにして…

今年はセミナーが非常に多く充実していました。

…などなど。

ちなみに自分は,キャラクターレンダリングについてお話させて頂きましたが,大した内容ではないので一般公開する予定はありません。もうちょい話せるネタが溜まったら,どこかのイベントで話せるときが来るといいなーって思っています。
飛行機に乗っている時間にあったセミナーについては聴くことが出来なかったので,Zinさん,うしおさん,Shockerさんの生のプレゼンを見れなかったのが非常に悔やまれます。あとで資料をじっくりみたいと思います。
今回,セミナーで収穫があったのは,きなこ餅さん,PathtracingにおけるCausticsレンダリングについての資料で,Manifold Next Event Estimationの説明があったことです。これ論文見てもよーわからんなーって思っていたのですが,非常にわかりやすい説明で,そういうことだったのか!と納得できました。これで一気に論文が読みやすくなりました。

昼飯は車で少しいったあたりにある タコライスcafe きじむなぁ恩納村店 でタコライスを頂きました。

昼飯を食べ後は,デノイズ部門と本戦です。
まず,今年新設されたデノイズ部門でしたが,人によって異なる特徴を持つデノイズ結果が出ており,非常に興味深くそこが面白かったです。自分は余力が無かったため,エントリーしなかったのですが,次回開催するときもデノイズ部門があるようであれば,エントリーしてみたいなと思っています。

デノイズ部門参加者はみんな機械学習系が来るだろうと構えていたみたいですが,意外とみんな普通に書いていたみたいです。
決勝はykozwさんとholeさんとyumcyawizさんの戦いでした。
ちなみに,holeさんとyumcyawizさんは,ベース手法としてNL-Means (Non Local Means)フィルタを使用していて,接戦でした。
ykozwさんの手法は,明るさなどが他の二人と比べていてリファレンスに近い明るさが出ているなど,優れている部分もあり決勝は投票が非常に難しかったです。
今回のデノイズ部門はみんな投票悩んでいる感じで,会場にいて全体見るとこっちがよさげなんだけども,部分的にみるとなぁとか,自分も同じ感じで悩んだりしていて,その雰囲気も面白かったです。

今年の本戦ですが,色々な作品があって面白かったです。
意外とみんなカットとか変えないだろうなと予想していたのですが,やはりレンダリング野郎の集いなので,色々と凝っていてレベルが高かったです。
自分は今年は,GPUレンダラー作ったことが無かったので,とりあえず動くものを作れれば順位とか気にしないという,スタンスでレンダラー書きました。
テクスチャアニメーションとかリアルタイムっぽいのを使う人はいないだろうと予想したので,特徴としてテクスチャスクロールするだけのテクスチャアニメーションを入れました。本当は綺麗なコースティクスを出したいなぁと思ったのですが,提出2日前に全然バグの原因がわからず,そのまま提出したのであんまりレイトレ感が無いので,次回はちゃんとレイトレ感がある作品を提出したいなぁと思います。
あと,提出間際にシーンを変更したりとか色々とやっていた関係で,もとのIBL画像がバグって表示されるという残念な結果になるのを全然確認できていなかったので,このあたりもきちんとデバッグしておこうと思います。
とりあえず,GPUレンダラーのベースがある程度できたので,バグを取り除いて来年も使えるレンダラーに育てていきたいなと思っています。

Shcokerさんとかうしおさんとかの作品見ていると新しい技術取り入れていていいなぁーって思いました。新しい技術は積極的に取り入れていきたいです。

今年ビビったのが,holeさんの作品で見ると分かるのですが,ノイズが無いです。これが一番,驚きがありました。しかも書いたのが提出日当日とかって化物じみていてすげぇなぁっていう感想しかないです。

今年の結果見ると,次回のレイトレ合宿の本戦はどんなハイレベルな戦いになるのか予想が全くつきませんね。
次回も非常に楽しみです!
こうした楽しいイベントに参加できるもの,きちんと運営してくださる方があってのことなので,非常に有難いです。いつも本当にありがとうございます!

もし,レイトレ合宿の次回開催に参加したい人はTwitterで自作レンダラーの画像をいっぱいアップロードしておくと良いかもしれません。
レイトレ合宿楽しいぞ!! 君もレンダラーを書いてみないか?

以上です。

レイトレ日記 2022/08/13

今日は,TAAを実装したのと,本番に向けてシーンを考えているうちに屈折マテリアルが欲しくなったので対応した。
大分落ち着くまでのフレーム数が減った気がするが,やっぱりデノイザーは欲しいので,明日頑張ろう。

レイトレ日記 2022/07/27

今日は,ノートPCでの起動チェックを行いました。
で,早速DirectX周りでハマりました。

まず,当たり前ですがSwapChainの解像度がサポートされているものしか対応しないので,デスクトップと同じ解像度を指定したら,SwapChainが作成できなくて起動できないという問題にあたりました。
結局,画像出力用のレンダーターゲットを1つ用意して,そちらは高解像度にしてリードバックして,CPUからPNGに書き出し。SwapChainの方は,縮小して表示することにしました。

次のハマりポイントですが,EnumOutputs()がエラーを返すというのでハマりました。どうやらIDXGIAdapterの中には,EnumOutputs()の0番が失敗するものがいるようです。で,それを採用するように軽く実装したら,今度はAdapterが変わってDXRのチェックに通らないみたいなことが発生しました。結局,EnumOutputs()用にAdapterは別のものにするという対応で,ようやくサポート解像度がとれるようになりました。本当,こういうところがDirectXは面倒くさくて嫌いです。
コードは下記のような感じになりました。

    // DXGIアダプター生成.
    {
        RefPtr<IDXGIAdapter1> pAdapter;
        for(auto adapterId=0;
            DXGI_ERROR_NOT_FOUND != m_pFactory->EnumAdapterByGpuPreference(adapterId, DXGI_GPU_PREFERENCE_HIGH_PERFORMANCE, IID_PPV_ARGS(pAdapter.GetAddress()));
            adapterId++)
        {
            DXGI_ADAPTER_DESC1 desc;
            auto hr = pAdapter->GetDesc1(&desc);
            if (FAILED(hr))
            { continue; }

            hr = D3D12CreateDevice(pAdapter.GetPtr(), D3D_FEATURE_LEVEL_11_0, __uuidof(ID3D12Device), nullptr);
            if (SUCCEEDED(hr))
            {
                if (m_pAdapter.GetPtr() == nullptr)
                {
                    m_pAdapter = pAdapter.GetPtr();
                    m_pAdapter->AddRef();
                }

                RefPtr<IDXGIOutput> pOutput;
                hr = pAdapter->EnumOutputs(0, pOutput.GetAddress());
                if (FAILED(hr))
                { continue; }

                hr = pOutput->QueryInterface(IID_PPV_ARGS(m_pOutput.GetAddress()));
                if (SUCCEEDED(hr))
                { break; }
            }
        }
    }

これで,一応ノートPCでプログラムが起動するようになりました。
今週末が,レギュレーションテストなので,明日はテスト用のアセット生成などをして本番と同じフローになるように大枠だけは整えたいなと思っています。