ScreenPocket - 画面の隙間

Unityエンジニアの日々の雑記。たまにpython3、DirectX、PhotoshopScript(JavaScript)も触ります

nearクリップ面基準での、傾斜並行投影変換

Unityのマニュアルにある傾斜錐体の変換

docs.unity3d.com

こちらは透視投影だと上手くいくのですが、平行投影で同じ変換を行うと、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を表示してみる。

f:id:ScreenPocket:20150905021510p:plain

何も置いていないのに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に貼り付けて動かすとこんな感じ↓

f:id:ScreenPocket:20150804013413p:plain

forwardRenderingの不透明描画の直前に4頂点2面のMeshを描いた。
もしかすると、深度を一番奥にして画面を覆う矩形を書くことで、
バッファクリアの負荷を下げることが出来るのかな??

気が向いたら試しますか。

モーションの計算を間引くには?

www.4gamer.net

上記の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グラフィックス」にしか見えなくて(笑)。

との事で、逆にチープになること請け合いかもしれません;

遠くのキャラのモーションを間引いて軽量化…とかには使えるかもですかね。

※動画は気が向いたら撮ります。