2017-01-01から1年間の記事一覧

フォグの実装

フォグ ゼルダの伝説を遊んでいたら,フォグを作りたくなりました。 レガシーな定数フォグ,高さフォグから実装して,ゆくゆくは大気散乱,ライトシャフトが出来たら良いなと思っています。 本来は,レンダリング時にフォグの計算も同時に行うべきだとは思います…

残像の実装

残像の実装 グレア効果の一つとして,残像効果を実装します。 実装自体は簡単で,ブルーム効果で利用した高輝度成分をソースとして, 残像用のバッファに一定割合で加算合成を繰り返していくだけで実現できます。 1秒あたりに,残像の効果はどれだけ減少するかの…

モーションブラーの実装

モーションブラー ゲームのフレームとフレームの間の動きに応じて,ブラーを与える効果がモーションブラーです。 レンダリングされた一枚のシーンがカメラによって撮影されたものと考えて,露出時間からブラーを計算します。 https://docs.unity3d.com/ja/curr…

FXAA3の組み込み

FXAA スクリーンスペースのアンチエイリアスの処理として,NVIDIAのFXAAが有名です。 ソースはNVIDIAのGameWorksのサンプルにあります。 https://developer.nvidia.com/gameworks-directx-samples 現在FXAAのバージョンは3.11のようで,FXAAの3系はマクロによ…

レンズゴーストの実装

レンズゴースト レンズゴーストを実装します。 レンズゴーストはブルームと違って,レンズ内部で反射を繰り返した光がハッキリと像となって写り込んだものです。 http://av.jpn.support.panasonic.com/support/dsc/knowhow/knowhow15.html 今回は以下のサイト…

シェーダー管理

シェーダー管理 今までいろいろとシェーダーを書いてきましたが,現在行っている管理の仕方を紹介します。 https://www.slideshare.net/siliconstudio/cedec2005-kawase http://research.tri-ace.com/ Shader Package 前提としてDirectX11環境でHLSLでShader …

Screen Space Ambient Occlusion : Alchemy AO

Ambient Occlusion アンビエントオクルージョンをやってみます。 http://frederikaalund.com/a-comparative-study-of-screen-space-ambient-occlusion-methods/ http://ambientocclusion.hatenablog.com/entry/2013/11/07/152755 アンビエントオクルージョン…

Compute Shader でFFTと畳み込み演算でブラー

はじめに 前回,ComputeShaderを利用してSummed Area Tableを作りましたが, 今回はFFT(高速フーリエ変換)をしてみたいと思います。 フーリエ変換ができれば,大きなカーネルの畳み込み計算を現実的な時間で出来て, Unreal Engineで言うところの,Convolution Bl…

Compute ShaderでSummed Area Table

Summed Area Table コンピュートシェーダーに興味が出てきたので,練習がてらSummed Area Table作成してブラーをかけてみます。 https://docs.nvidia.com/gameworks/content/gameworkslibrary/graphicssamples/d3d_samples/d3dcomputefiltersample.htm https:…

プロファイラの作成

ImGuiを使って,フレームのCPU時間とGPU時間を可視化するプロファイラを作りました。 それだけです。 プロファイラを作ってわかったのですが,被写界深度処理が重いので,やはり最適化の余地ありという気がします。

ImGuiの導入

ImGuiとは ImGuiとは,楽に組み込みができて,簡易的なGUIを提供するライブラリです。 https://github.com/ocornut/imgui 例えば,このようなコードを書くと, ImGui::Begin("Stats", nullptr, window_flags); ImGui::LabelText("", "FPS:%4.2f (%4.2f ms)", s_F…

スキャッターベースのボケ

ギャザーベースとスキャッターベース 前回までの被写界深度処理は,ギャザーベースと呼ばれているカテゴリの方法です。 周囲のサンプリングして集めて一つのピクセルの色を決定するという意味でギャザーベースと言われているのだと思います。 ただし,ギャザー…

倍率色収差の実装

倍率色収差 今回は簡単に出来そうな倍率色収差を実装してみます。 収差とは,レンズを通る光の波長の違いによるズレによる現象のことですが,倍率色収差は画面の周辺部にかけて色がズレていく現象のことだそうです。 http://cweb.canon.jp/eos/special/dlo/fac…

フラットなブラー

ボケの形 被写界深度表現を実装しましたが, なんとなくガウスブラーで画面をボカシていました。 実際はカメラのボケというようのは,ガウシアンのボケではなく,カメラの絞りの形状による円形だったり六角形のフラットなボケとなるはずです。 今回はガウスブラ…

ディザリングの実装

ディザリング トーンマップやガンマ補正を行うと, Float精度のHDRテクスチャから8bit精度のSDRテクスチャへのマッピングができるわけですが, シーンによっては精度不足であったりしてバンドが見えてしまうことがあります。 上の図は,画面の左から右にかけて,…

カラーコレクション

カラーコレクション 今度は最低限のカラーコレクション(ColorCorrection)を実装します。 カラーコレクションを行うことも踏まえて,今までのフローをおさらいします。 カラーコレクションを行う場合は,トーンマッピング前後における,HDR空間()かSDR空間()での…

光芒の実装

光芒 グレア表現として,ブルームを実装しましたが これだけでは寂しいので光芒(スター)を実装してみます。 光芒は物理的には,カメラの絞り羽根による光の回折現象によって特定の方向に光が伸びていくような現象のことを呼びます。 https://www.bhphotovideo.…

オートフォーカスの実装

オートフォーカス 被写界深度表現を実装したので, 現実のカメラとかスマホにあるオートフォーカス機能を実装してみようと思います。 Depthテクスチャから中央付近のピクセルをサンプリングすれば,カメラから画面中心の物体までの距離が取得できるので, この…

被写界深度表現の実装

被写界深度とは 今度はカメラで撮った写真のような,ボケのある表現を実装してみたいと思います。 UnrealEngineのドキュメントを見ると,どんな感じの表現なのか掴みやすいでしょう。 Unreal Engine | 被写界深度 錯乱円の公式 ある点からレンズを通ってフィル…

トーンマップいろいろ

はじめに 今回はトーンマップをいろいろ作って遊んでみます。 前回の続きです。 前提として, 平均輝度での露光処理 ガンマ補正 ブルーム処理 などを行っています トーンマップ 線形マップ ただ入力をそのまま出力しただけです。もはやトーンマップではないで…

ブルームの実装

ブルーム 前回,HDRテクスチャのトーンマッピングをしたので, よりHDRテクスチャを使っている感を出すためにブルームを実装します。 ブルームとは光が周辺のピクセルに滲み出るようなエフェクトの事を呼びます。詳しくはUnityの説明にでも。 https://docs.uni…

HDRテクスチャからSDRテクスチャへのトーンマップ

HDRテクスチャ 普通のテクスチャ(=SDRテクスチャ)は,RGBAのそれぞれのチャンネルで0~255まで範囲で正規化して0.0~1.0の範囲の色を表現する8bit固定小数精度のものを指します。 一方,HDRテクスチャはそれぞれのチャンネルで浮動小数点精度の値を持つテクスチ…