nearクリップ面基準での、傾斜並行投影変換
Unityのマニュアルにある傾斜錐体の変換
こちらは透視投影だと上手くいくのですが、平行投影で同じ変換を行うと、farクリップ平面基準の変換がかかってしまうみたい。
※つまりカメラ位置が大幅にずれる
どうしたもんかなーと色々探した結果、下記の変換を行えばnearクリップ平面基準で傾斜させられるとのこと。
http://aras-p.info/texts/obliqueortho.html
※追記:
微妙かも、要再調査。
VisualStudio2012で.Net Framework 3.5 を指定するための方法
こちら
http://www.ruche-home.net/boyaki/2012-10-14/CCLIVisu
や
Visual Studio 2012 C++で.NET Framework 4.0 以前をターゲットする方法 - コード スペランカー
こちらで書かれている TargetFramework エレメントが*.vcxprojの中に発見できなくて困っていましたが、
https://msdn.microsoft.com/ja-jp/library/vstudio/ff770576(v=vs.110).aspx
こちらを見ると
<Project> の要素の <PropertyGroup Label="Globals">
に
<TargetFrameworkVersion>バージョン番号</TargetFrameworkVersion>
を差し込めば良いとのことでした。
CameraのClearFlagsによる負荷
新しいシーンを作ってすぐにstatsを表示してみる。
何も置いていないのにBaches 1、Tris 1.7k Verts 5.0k !!??
シーンを作っただけで1,700面5,000頂点とかヒドい…!
で、こちらの描画関連の値ですが、MainCameraのClearFlagsで変化するので調べてみました。
ついでにFrameDebuggerも立ち上げて、描画イベントもチェック。
ClearFlags | Event | Batches | Tris | Verts | SetPassCall |
---|---|---|---|---|---|
Skybox | 3 | 1 | 約1,700 | 約5,000 | 1 |
Solid Color | 2 | 0 | 0 | 0 | 0 |
Depth Only | 2 | 0 | 0 | 0 | 0 |
Don't Clear | 1 | 1 | 1 | 4 | 1 |
ん?何で、何もしないはずのDon'tClearで頂点と面が出来ているの??
ということで、気になってカメラを増やしてみたり色々試したところ、最後のカメラがDon'tClearだった場合にBatches、Tris、Vertsが上がるみたい。
おぉ、これは新発見だわ!と思って息巻いた矢先ですが、
FrameDebugerを止めて実行するとBatches、Tris、Vertsが0になりました;
デバッガ用の表示分で描画が必要なだけだったっぽいかな??
という事で今回のまとめ。
- Skybox重い。。DrawCall 1、面数 1,700、頂点数 5,000、SetPass 1
- Stats表記はFrameDebuggerの影響を受けるので、計測する際に気をつける事
…あまり面白い結果ではなかった;はぁ。
ScriptableObjectのプレビュー
これまた備忘録ですが、自前で作ったScriptableObjectのプレビューは↓で作ることが出来そう
http://docs.unity3d.com/ja/current/ScriptReference/ObjectPreview.html
ScriptableObjectでモデルを組み合わせたりするときは、ロード中はHasPreviewGUIをfalseで返すとか細工が必要そうかな。
Assetを作った時のコールバック
特定のフォルダ以下にAssetを追加した時にアセットバンドル名を自動で指定する仕組みをAssetPostprocessor.OnPostProcessAllAssets()で作ったのですが、それだとどうにも対応できない事があって悩んでいました。
http://docs.unity3d.com/ja/current/ScriptReference/AssetPostprocessor.OnPostprocessAllAssets.html
というのもAssetPostprocessor.OnPostProcessAllAssets()だと渡される引数が
- Importした時(importAssets)
- 消した時(deletedAssets)
- 移動した時(movedAssets)
- 何処から移動してきたのか(movedFromAssetPaths)
だけだったので、じゃあAssetをCreateした時はどうすんのよ。Reimportしなきゃいかんの?と悩んでいましたが AssetModificationProcessor なるものがある様子。
http://docs.unity3d.com/ja/current/ScriptReference/AssetModificationProcessor.html
OnWillDeleteAsset()とOnWillMoveAsset()はPro版でないと使えないようだけど、OnWillCreateAsset()を使えば上記の対応はできそうかも??
また試してみよう。
CommandBuffer事始め
ネットを検索したところ、あまりコマンドバッファについての記述が見つからなかったので、とりあえず簡単なのを書いてみた。
using UnityEngine.Rendering;
public class CommandBufferTest : MonoBehaviour {
Camera myCamera;
// Use this for initialization
void Start () {
myCamera = GetComponent< Camera >();
var cb = new CommandBuffer();
var mesh = new Mesh();
mesh.vertices = new Vector3{
new Vector3(-1,-1,0),
new Vector3(1,-1,0),
new Vector3(-1,1,0),
new Vector3(1,1,0)
};
mesh.SetIndices( new int{0,1,2,1,2,3}, MeshTopology.Triangles, 0 );
var mat = new Material( Shader.Find("Diffuse") );
cb.DrawMesh( mesh, Matrix4x4.identity, mat );
myCamera.AddCommandBuffer( CameraEvent.BeforeForwardOpaque, cb );
}
// Update is called once per frame
void Update () {
}
}
↑のScriptコンポーネントをカメラのGameObjectに貼り付けて動かすとこんな感じ↓
forwardRenderingの不透明描画の直前に4頂点2面のMeshを描いた。
もしかすると、深度を一番奥にして画面を覆う矩形を書くことで、
バッファクリアの負荷を下げることが出来るのかな??
気が向いたら試しますか。
モーションの計算を間引くには?
上記のLimitedAnimationの記述を見て、「そういえばモーションの計算を間引くのはどうやればいいのだろう??」と気になったので調べてみました。
■ Animation(Legacy)の場合
単純に animation の enabled を 特定のフレーム間隔でtrueにすれば実現できました。
myAnimation.enabled = counter % 3 == 0;
counter++;
みたいな。
ちょっと面白かったのが、「3フレームに1回更新にするんだったら、アニメーション速度を3倍にしなければ…」と思っていたのですが、それが必要なかった点。
直前にenabledで計算した時間から経過時間をとっているのかな??
■ Animatorの場合
こちらも特定のタイミングでenabledをtruenにすれば良い。
ただ、こっちの場合はアニメーションスピードを間引いたフレーム分倍速化しなければ動きが一致しない。
myAnimator.enabled = counter % 3 == 0;
counter++;
myAnimator.speed = 3f;
みたいな。
という事でアニメーションの更新タイミングを間引くことが可能になりましたが、上記のリンク先にもあるように
最初期はFカーブを用いて毎秒60コマのフルフレームでキャラクターを動かし,その60コマのアニメーションから間引いていくような制作手法も試してみました。ただ,そうすると,ただの「コマ落ちした3Dグラフィックス」にしか見えなくて(笑)。
との事で、逆にチープになること請け合いかもしれません;
遠くのキャラのモーションを間引いて軽量化…とかには使えるかもですかね。
※動画は気が向いたら撮ります。