sRGBからリニアへの変換は, 2乗で近似する.
sRGB to Linear
LinearRGB = sRGB*sRGB;
2015年12月2日水曜日
Unity3D 5 "Enable Internal Profiler"をスクリプトから設定
PlayerSettings.enableInternalProfilerは, iOS用です.
Androidは, プロパティ名 "AndroidProfiler"です.
Androidは, プロパティ名 "AndroidProfiler"です.
//For iOS PlayerSettings.enableInternalProfiler = true; //For Android PlayerSettings[] playerSettings = Resources.FindObjectsOfTypeAll(); foreach(PlayerSettings ps in playerSettings) { SerializedObject serializedObject = new SerializedObject(ps); SerializedProperty enableInternalProfiler = serializedObject.FindProperty("AndroidProfiler"); if(null == enableInternalProfiler) { continue; } enableInternalProfiler.boolValue = true; serializedObject.ApplyModifiedProperties(); }
2015年11月26日木曜日
2015年11月23日月曜日
2015年11月17日火曜日
Unity3D RenderTextureから, RenderTargetIdentifierを作成
renderTexture = new RenderTexture( width, height, 24, RenderTextureFormat.Default, RenderTextureReadWrite.Default); CommandBuffer commandBuffer = new CommandBuffer(); int screenCopyID1 = Shader.PropertyToID("_Temp1"); commandBuffer.GetTemporaryRT( screenCopyID1, width, height, 0, FilterMode.Bilinear); RenderTargetIdentifier renderTargetId = new RenderTargetIdentifier(renderTexture); commandBuffer.Blit(renderTargetId, screenCopyID1);てな感じで, コマンドバッファに組み込んでいける.
2015年10月30日金曜日
2015年10月18日日曜日
Unity3D 16bit ディザリング
テクスチャリソースのインポート処理時に,
ディザリング処理して16ビットに変換する.
Contrast Aware Halftoningを実装.
https://github.com/taqu/Dither
ディザリング処理して16ビットに変換する.
Contrast Aware Halftoningを実装.
https://github.com/taqu/Dither
2015年9月14日月曜日
Bounding Volume Hierarchy 01
既存のコードはQBVHだが, すでに古いらしいので, 古典から順番に作成中.
- SAHBVH
- Surface Area Heuristic (SAH)をがっつりまじめに計算.
- BinBVH
- Highly Parallel Fast KD-tree Construction for Interactive Ray Tracing of Dynamic Scenes
- SAH計算をbinningで高速化.
- QBVH
- Shallow Bounding Volume Hierarchies for Fast SIMD Ray Tracing of Incoherent Rays
- Bounding Boxを節ノードに4つ作る, 4分木を構成.
- トラバースの際に, 4つのBounding BoxとレイをSIMDで同時交差判定.
2015年9月5日土曜日
チューリング先生のマラソン記録
チューリング先生のマラソンベストタイムは, 2時間46分だそうです.
1940年前後のオリンピックマラソン金メダリストの記録は, 2時間30分前後でした.
世のプログラマは斯くあるべきと思う.
私は現在のシューズや舗装路の進化がありながら, 約30分離されている.
2015年9月3日木曜日
2015年8月19日水曜日
Microflake SGGX for Mitsuba Renderer
https://github.com/taqu/Microflake-SGGX
今すぐリアルタイムレンダリングに応用できるか?
と問われると思いつかない.
十分小さな誤差で線形補間ができるという性質は,
リアルタイムレンダリングへの応用を期待させる.
今すぐリアルタイムレンダリングに応用できるか?
と問われると思いつかない.
十分小さな誤差で線形補間ができるという性質は,
リアルタイムレンダリングへの応用を期待させる.
2015年7月24日金曜日
Opus再生サンプル
OpusでエンコードされたサウンドのOggファイルを再生するライブラリ, サンプルを作成.
https://github.com/taqu/opus
opus, ogg, opusfile, speexDSPライブラリを使用した.
Windowsでは, WASAPIをバックグランドに,
Androidでは, OpenSL ESをバックグラウンドに使用する.
Unity5のサンプルも作成してみた.
Nexus5では再生遅延の差はほとんどないが,
Xperia Z1 f SO-02Fでは明らかにUnity 3Dの方が遅い.
VorbisとOpusの差なのか, Unity 3Dの処理がよほどXperiaと相性が悪いのか.
https://github.com/taqu/opus
opus, ogg, opusfile, speexDSPライブラリを使用した.
Windowsでは, WASAPIをバックグランドに,
Androidでは, OpenSL ESをバックグラウンドに使用する.
Unity5のサンプルも作成してみた.
Nexus5では再生遅延の差はほとんどないが,
Xperia Z1 f SO-02Fでは明らかにUnity 3Dの方が遅い.
VorbisとOpusの差なのか, Unity 3Dの処理がよほどXperiaと相性が悪いのか.
OpenSL ES
仕様を読む限り,
SL_IID_ENGINECAPABILITIES
の実装は必須に見えるが手持ちのデバイスではとれない.
とりあえず失敗するまでCreateAudioPlayerをするしかない.
初めは, BufferQueue::GetStateで未処理バッファ数をチェックして,
データを補充する方法をとったが, 十分間に合っていると思われるのに
ノイズが入る.
ポーリングでデータを準備して, BufferQueueのコールバックで
BufferQueue::Enqueueに引き渡せばノイズが入らなくなった.
また何か見落とした文章があるのだろう.
SL_IID_ENGINECAPABILITIES
の実装は必須に見えるが手持ちのデバイスではとれない.
とりあえず失敗するまでCreateAudioPlayerをするしかない.
初めは, BufferQueue::GetStateで未処理バッファ数をチェックして,
データを補充する方法をとったが, 十分間に合っていると思われるのに
ノイズが入る.
ポーリングでデータを準備して, BufferQueueのコールバックで
BufferQueue::Enqueueに引き渡せばノイズが入らなくなった.
また何か見落とした文章があるのだろう.
WASAPI
WASAPIは, Core Audio APIsの中の音声再生API.
User-Mode Audio Components
共有モードと排他モードがあるが, ゲーム等, 音声を複数再生する場合,
共有モードを使用する.
基本はサンプルとおり
Rendering a Stream
音声再生のプログラムは,
ドライバなりエンジンからの次データ要求や,
再生バッファの空きの検知をトリガーに,
音声データをドライバ・エンジンに引き渡す処理を繰り返す.
WASAPIの場合, ポーリングで未処理をデータサイズを調べるか, イベントで検知する.
イベントは, WindowsのEventを引き渡し, そのEventがセットされるかチェックする.
イベントを使う方法は, 複数音声の管理には向いていないと思われる.
Core Audio APIsは, エフェクトの機能はなく, 高位のMedia Foundation等が提供する.
サンプル周波数変換には, IAudioClockAdjustmentが共有モードで使用できるが,
品質のほどはわからない.
Speexの, 信号処理部分を纏めたSpeexDSPがある.
resamplerだけ抜き出すのも簡単.
User-Mode Audio Components
共有モードと排他モードがあるが, ゲーム等, 音声を複数再生する場合,
共有モードを使用する.
基本はサンプルとおり
Rendering a Stream
音声再生のプログラムは,
ドライバなりエンジンからの次データ要求や,
再生バッファの空きの検知をトリガーに,
音声データをドライバ・エンジンに引き渡す処理を繰り返す.
WASAPIの場合, ポーリングで未処理をデータサイズを調べるか, イベントで検知する.
イベントは, WindowsのEventを引き渡し, そのEventがセットされるかチェックする.
イベントを使う方法は, 複数音声の管理には向いていないと思われる.
Core Audio APIsは, エフェクトの機能はなく, 高位のMedia Foundation等が提供する.
サンプル周波数変換には, IAudioClockAdjustmentが共有モードで使用できるが,
品質のほどはわからない.
Speexの, 信号処理部分を纏めたSpeexDSPがある.
resamplerだけ抜き出すのも簡単.
2015年6月23日火曜日
2015年4月28日火曜日
Timsort
Timsortを, python 3.4.3のコードを1行1行追いながら移植.
GitHub-Timsort
以下のJava7の実装では例外が発生するケースでテストしてみた.
http://envisage-project.eu/proving-android-java-and-python-sorting-algorithm-is-broken-and-how-to-fix-it/
コードがかなり複雑. gallop_rightのあたりの理解がさっぱり.
ランダムデータではIntrosortの方が,
ソートされた部分が多いほどTimsortの方が速い,
とのことであるが, 実測はどうだろうか.
適材適所ではあるので, ライブラリに
アルゴリズムが複数あって困ることはない.
ついでにGoogle CodeからGitHubへ移行.
Exportボタンを押すだけで終了したので,
何か書くことも無し.
GitHub-Timsort
以下のJava7の実装では例外が発生するケースでテストしてみた.
http://envisage-project.eu/proving-android-java-and-python-sorting-algorithm-is-broken-and-how-to-fix-it/
コードがかなり複雑. gallop_rightのあたりの理解がさっぱり.
ランダムデータではIntrosortの方が,
ソートされた部分が多いほどTimsortの方が速い,
とのことであるが, 実測はどうだろうか.
適材適所ではあるので, ライブラリに
アルゴリズムが複数あって困ることはない.
ついでにGoogle CodeからGitHubへ移行.
Exportボタンを押すだけで終了したので,
何か書くことも無し.
2015年3月16日月曜日
Hopscotch Hashingとその他
Hopscotch Hashingに入れ換える.
簡単なテストでは, Google Dense HashMapより速いよう.
キーからハッシュ等で計算した最初の位置を, ハッシュ値と呼ぶことにする.
その位置に, その位置から後ろの同じハッシュ値のキーが入っている場所を,
ビットマップとして保存する.
4bitのビットマップで, 位置nのビットマップが
bitmap=0101
なら, n, n+2に, ハッシュ値nのキーが入っている.
・検索は, ビットマップのビット数先までしか検索しない.
ビットマップだけで空かどうかわかる.
・挿入は, 適当にビットマップのビット数 x M倍先までしか空きを検索しない.
論文ではM=8だそうです.
空きの位置を, ビットマップの範囲に入るまで移動してくる.
・削除は, 通常のマップの削除処理に追加で,
ハッシュ値と削除位置の差分からビットマップをクリアするだけ.
削除フラグは必要なし. 空きフラグは必要.
Cuckoo Hashingというのも.
Open Addressingに対して, ビットマップという余計なデータがある.
メモリ効率は仕方がないが, 追加の操作がビットマップに対する操作なのがポイントなのだろう.
ビットマップサイズ4バイト, M=8の場合で32バイト,
64バイトのキャッシュラインなら平均的に8割ぐらいキャッシュラインに入る.
Google Codeが終了のお知らせ.
引っ越し先はGitHubでいいのだろうけど,
お金払って安心を買いたい.
簡単なテストでは, Google Dense HashMapより速いよう.
キーからハッシュ等で計算した最初の位置を, ハッシュ値と呼ぶことにする.
その位置に, その位置から後ろの同じハッシュ値のキーが入っている場所を,
ビットマップとして保存する.
4bitのビットマップで, 位置nのビットマップが
bitmap=0101
なら, n, n+2に, ハッシュ値nのキーが入っている.
・検索は, ビットマップのビット数先までしか検索しない.
ビットマップだけで空かどうかわかる.
・挿入は, 適当にビットマップのビット数 x M倍先までしか空きを検索しない.
論文ではM=8だそうです.
空きの位置を, ビットマップの範囲に入るまで移動してくる.
・削除は, 通常のマップの削除処理に追加で,
ハッシュ値と削除位置の差分からビットマップをクリアするだけ.
削除フラグは必要なし. 空きフラグは必要.
Cuckoo Hashingというのも.
Open Addressingに対して, ビットマップという余計なデータがある.
メモリ効率は仕方がないが, 追加の操作がビットマップに対する操作なのがポイントなのだろう.
ビットマップサイズ4バイト, M=8の場合で32バイト,
64バイトのキャッシュラインなら平均的に8割ぐらいキャッシュラインに入る.
Google Codeが終了のお知らせ.
引っ越し先はGitHubでいいのだろうけど,
お金払って安心を買いたい.
2015年2月26日木曜日
Moment Shadow Mapping
Moment Shadow Mapping
Interactive 3D Graphics and Games 2015の論文です.
Game Developer Conferenceより参加したいかもしれない.
上: フィルタ無し, 中: PCF, 下: MSM.
Moment Shadow Mapping (MSM)は, 1024x1024を512x512にダウンサンプル,
1回ガウス関数でブラーをかけています. 16bit float RGBAのバッファを使用しています.
Percentage closer filtering (PCF)は, 5点サンプルしています.
光滲みを抑えるために,暗くなってしまいます.
光源方向と法線が直交に近い場合, カスケード間のギャップが大きくなるのを抑えたい.
ソフトシャドウに使わなければ, 処理負荷・メモリ使用量的にもPCFがよいかもしれない.
Variance Shadow Mapping よりは, Exponential Variance Shadow Mapping,
そして Moment Shadow Mappingの方がよさそうです.
詳しくないので, ふわっとした感想です.
ソフトシャドウ. カスケードの境目はまだ目立つ.
Interactive 3D Graphics and Games 2015の論文です.
Game Developer Conferenceより参加したいかもしれない.
上: フィルタ無し, 中: PCF, 下: MSM.
Moment Shadow Mapping (MSM)は, 1024x1024を512x512にダウンサンプル,
1回ガウス関数でブラーをかけています. 16bit float RGBAのバッファを使用しています.
Percentage closer filtering (PCF)は, 5点サンプルしています.
光滲みを抑えるために,暗くなってしまいます.
光源方向と法線が直交に近い場合, カスケード間のギャップが大きくなるのを抑えたい.
ソフトシャドウに使わなければ, 処理負荷・メモリ使用量的にもPCFがよいかもしれない.
Variance Shadow Mapping よりは, Exponential Variance Shadow Mapping,
そして Moment Shadow Mappingの方がよさそうです.
詳しくないので, ふわっとした感想です.
ソフトシャドウ. カスケードの境目はまだ目立つ.
2015年2月16日月曜日
Anti Aliasing
登録:
投稿 (Atom)