0013-04-06

[][]リアルタイムAOのテスト リアルタイムAOのテスト - Nao_uの日記 を含むブックマーク はてなブックマーク - リアルタイムAOのテスト - Nao_uの日記 リアルタイムAOのテスト - Nao_uの日記 のブックマークコメント

AOあり

AOなし

ぼかしたシャドウマップ+密度と距離を変えたSSAOの3段重ね。離れた部分のAOはシャドウマップから生成して、細かい部分をSSAOでフォローする感じ。

シャドウマップのAOは大雑把にしかかからない代わりにワールド座標系でAOが適用できるので、広いエリアのカバーが苦手だったり、スクリーン端では正確に出ないなどのSSAOの弱点を補える。

細かいノイズが目立つのでもう一段ブラーを掛けた方がよさそう。

これだけでも奥行きや位置関係のわかりやすさがだいぶ違う。立体視をやるときにもこういうのは意外と重要なのかも

追記:

パラメータ調整、フィルタを追加、ノイズを毎フレームずらすように(静止画では変わらないけど)



[][]シャドウ/ライト計算関連のメモ(3) シャドウ/ライト計算関連のメモ(3) - Nao_uの日記 を含むブックマーク はてなブックマーク - シャドウ/ライト計算関連のメモ(3) - Nao_uの日記 シャドウ/ライト計算関連のメモ(3) - Nao_uの日記 のブックマークコメント

シャドウの計算のみを置き換えるなら、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」が必要になる。

Assets/Resoueces フォルダにいれないと、開発中は動くのにWebPlayerで動かなくなるらしい。注意。

シェーダー内でランダム値を計算 シェーダー内でランダム値を計算 - Nao_uの日記 を含むブックマーク はてなブックマーク - シェーダー内でランダム値を計算 - Nao_uの日記 シェーダー内でランダム値を計算 - Nao_uの日記 のブックマークコメント

float rand(vec2 co){

    return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);

}


SM4.0以降でのシェーダー内での乱数発生 SM4.0以降でのシェーダー内での乱数発生 - Nao_uの日記 を含むブックマーク はてなブックマーク - SM4.0以降でのシェーダー内での乱数発生 - Nao_uの日記 SM4.0以降でのシェーダー内での乱数発生 - Nao_uの日記 のブックマークコメント

// 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 …)なので下位ビットのランダム性が低いのに注意しないといけませんが、ここでは上位ビットを直接仮数部に割り当てているので特に問題はありませんね