■ [作業履歴][unity]リアルタイムAOのテスト
AOあり
AOなし
ぼかしたシャドウマップ+密度と距離を変えたSSAOの3段重ね。離れた部分のAOはシャドウマップから生成して、細かい部分をSSAOでフォローする感じ。
シャドウマップのAOは大雑把にしかかからない代わりにワールド座標系でAOが適用できるので、広いエリアのカバーが苦手だったり、スクリーン端では正確に出ないなどのSSAOの弱点を補える。
細かいノイズが目立つのでもう一段ブラーを掛けた方がよさそう。
これだけでも奥行きや位置関係のわかりやすさがだいぶ違う。立体視をやるときにもこういうのは意外と重要なのかも
追記:
パラメータ調整、フィルタを追加、ノイズを毎フレームずらすように(静止画では変わらないけど)
■ [作業履歴][unity]シャドウ/ライト計算関連のメモ(3)
シャドウの計算のみを置き換えるなら、Differd Renderingにして Internal-PrePassLighting.shader を差し替えるのが楽そう。
Assets/Resoueces フォルダに Internal-PrePassLighting.shader をコピって入れるだけで差し替え可能。 Forward Rendertingの時にどうするかは別途調べる必要あり。
※Internal-PrePassLighting.shader はライトの計算だけだった。ここでやってるのはあいかわらずスクリーンから影マスクを取ってきてるだけだった。PrePassのシャドウの挙動を変えたいなら、Internal-PrePassCollectShadows.shader を入れないとダメ。
今日のハマりポイント
- Assets/Resoueces フォルダに入れるだけではだめで、一回Unity自体の再起動が必要。コンパイルは走るのにゲームに反映されないので気づきにくい
- シェーダーで使う命令数が増えると「Shader error in 'Hidden/Internal-PrePassCollectShadows': Program 'frag', Arithmetic instruction limit of 64 exceeded; 71 arithmetic instructions needed to compile program」みたいなエラーが出るので「#pragma target 3.0」が必要になる。
- Modified Internal-PrePassLighting isn't used in webplayer
Assets/Resoueces フォルダにいれないと、開発中は動くのにWebPlayerで動かなくなるらしい。注意。
■ シェーダー内でランダム値を計算
float rand(vec2 co){
return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);
}
■ SM4.0以降でのシェーダー内での乱数発生
// Return [0,1) random value
float GetRandom(inout uint seed)
{
seed = 1664525 * seed + 1013904223;
return asfloat(0x3F800000 | (seed >> 9)) - 1.0f;
}
Higeneko Tech Higeneko Tech @HigenekoTech
シェーダー内での乱数発生、SM4.0以降だとビットシフトやビットデータを浮動小数点へ変換できたりするから、こんな書き方ができたりしますね
Higeneko Tech @HigenekoTech
ちなみに、これは単純な線形合同法(http://ja.wikipedia.org/wiki/%E7%B7%9A%E5%BD%A2%E5%90%88%E5%90%8C%E6%B3%95 …)なので下位ビットのランダム性が低いのに注意しないといけませんが、ここでは上位ビットを直接仮数部に割り当てているので特に問題はありませんね