2016年12月11日日曜日

Blenderが何かと動作が遅くなる対策

久しぶりにBlenderを起動してみたら、何かとプチフリぽく動作が遅くなる現象が発生。

テクスチャを読み込むダイアログが出るまでに数十秒かかったり、いろいろな箇所が遅く・・・。

■環境

OS:Windows10。
GPU: nVidia GeForce GTX1060
Blender 2.77a/2.78a (x64)


■原因

どうもnvidiaのドライバが原因に関係しているようです。
状況としては、
  • 発生を確認したのはここ1~2か月位。
  • 少なくとも最近アップデートしたドライババージョン376.19では発生を確認。頻度高。
    たまにBlenderがハングアップするときもある。
  • 少し前のバージョンでも発生(正確なバージョン番号失念)。

■対策

nVidiaのコントロールパネルにBlenderを登録することで回避できるようです。

【手順】

  1. デスクトップ上のアイコンが無いスペースで、右クリック>nVidiaコントロールパネル でnVidiaのコンパネを開く。
    ※nVidiaのコンパネが開ければ他の方法でも可。
  2. nVidiaのコンパネを開いたら、左列のツリーで 3D設定>3D設定の管理 をクリック。
  3. プログラム設定のタブをクリック。
  4. 追加 をクリックしてBlender.exeを選ぶ。
    又はフォルダごと指定可能。
  5. 適用 をクリック。
    「カスタマイズするプログラムを選択する」のプルダウンで登録されていることを確認する。
  6. PCを再起動。


今のところこれで改善しているので、しばらく様子見です。




2016年10月26日水曜日

HTC VIVE で Euro Truck Simulator 2 をプレイする方法

HTC VIVE で Euro Truck Simulator 2 をプレイする際、若干設定が必要だったのでメモ。


VIVEのセットアップはできている前提として、
 

  1. SteamVRを起動する
  2. デフォルトではここでSTEAMクライアントが自動起動する。
    起動しなかった場合は、手動でSTEAMクライアント起動。
  3. STEAMの「ライブラリ」 で 「Euro Truck Simulator 2」行の上で右クリック>プロパティ選択。
  4. 「一般」タブで「起動オプションを設定」クリック
    起動オプション欄に次を記述してOKクリック。
    -openvr
  5. 「SteamVRが有効なときはデスクトップゲームシアターを使用する」のチェックを外す。
    ※PC画面が出なくなる。VIVE画面にのみゲーム画面が出る。
     フレームレート的にもPC画面はOFFの方が良い。
  6. 「ベータ」タブをクリック。
  7. 「参加希望のベータを選択してください:」のプルダウンから、
    oculus - Experimental Oculus support(1.4.0) - 1.25
    を選択する。
  8. ライブラリから、Euro Truck Simulator 2 起動。
    この時、
    「Euro Truck Simulator 2 はVRをサポートしていません。デスクトップ上に出現し、VRパフォーマンスに影響を及ぼすかもしれません。」
    と出てくるが、「OK」で進む。
  9. これでPC画面には何もでませんが、VIVE画面にVRで表示されます。


他気づいた点等

  • 結構酔う。※PC性能、個人差諸々有り
    3D耐性はかなり高い方なのですが・・・結構きました。
    他のルームスケール系ソフトは全然酔わなかったので、体感動作が無いのもやはり一因かも?
    あとグラボの性能がいまいちなせいもあるかもしれません(フレームレート不足的な問題)。
  • グラフィックがちょっと荒い。
    内部解像度を上げるか調整すれば改善しそうですが、手持ちグラボでは限界な様子。
  • ハンドルでの操作おすすめ
  • 途中の操作系がキーボード、マウスを使う
    VRですべて操作できないので少々面倒。




PSVR、Oculus rift諸々もかなり体験してきましたが、個人的にはVIVEの Light Houseが機能的に素晴らしすぎる感。
とはいえ今後は物珍しさよりも良質なコンテンツ勝負に突入していくと思うので PSVR も目が離せません。

2016年10月22日土曜日

リフレクションプローブ


Unity5でリフレクションプローブ(ReflectionProbe)を使うメモ。

使用環境:Unity5.4.2f1

どんなことができるか

室内において、金属などの反射オブジェクトの映り込みを調整したい場合等に有効。

通常反射物は室内でもスカイボックスの影響を受けてしまう。
(基本的にスカイボックスはシーン上のオブジェクトすべてに影響する為)。


そのような際にリフレクションプローブを配置することで室内の風景を映り込ませることで解決できる。
他、車が空下からトンネルに入った際などの映り込みの切り替えなど。



リフレクションプローブ概要

リフレクションプローブを置いた地点から360度視界のCubemapを内部で自動生成してくれる。
Cubemapはスカイボックスで使われている6面ボックスのマップと同じ概念で、自分でCubemapを指定することも可能。
Cubemap生成範囲は指定可能なので部屋の壁、床、天井などを範囲に設定すると良い感じ。

あたかも部屋専用のスカイボックス=Cubemapがあるようになる(ただし実際にシーン上では見えない)。

リフレクションプローブの有効範囲内にあるオブジェクトは、先のCubemapが映り込むようにできる。
結果的に部屋内の景観(壁、床、天井、置物類)が映り込むような状態にできる。

映り込み先の(反射する)オブジェクトは移動するものでも可。

リフレクションの種類指定は3つでコンポーネントのTypeで指定。
  • Baked
    事前に設定されているリフレクション空間から静的な(映り込ませ用の)Cubemapを自動生成してくれる。ただし映り込む周囲景観オブジェクトはstatic限定。
    しかしその分軽量でモバイルでも使える可能性がある。
  • Custom
    ユーザが用意したCubemapを手動で指定できる。
  • Realtime
    static以外の周囲景観オブジェクトも映り込む。動的にCubemapを生成することになる為、負荷は上がる。

主にBakedを使うことが多くなりそうな気がします。 


リフレクションプローブ設置手順(Baked)

リフレクションプローブの設置と設定


部屋の中に設置すると仮定して、


Empty Objectを作る。

コンポーネント ReflectionProbe を追加する。

コンポーネント ReflectionProbe のTypeはBakedにしておく。

これを部屋の真ん中付近に置く。
※この置いた地点を中心に360度視点のCubeマップを自動生成してくれるようになる。
※あえて映り込ませたいようなオブジェクトアイテムがある場合はその中心に配置するとそこを中心にCubemapを生成してくれるので良い感じ。
コンポーネント ReflectionProbe でCubemap生成範囲を設定する。
図中#2ボタン押しでシーン内に調整点がでてくるので、それを掴んでドラッグで調整。



映り込む側オブジェクトの設定

部屋の壁、天井、床などの周囲景観として映り込ませたいオブジェクトの設定。

オブジェクトを static に設定する。


映り込まれる側オブジェクトの設定

  • Mesh Renderer
    Reflection Probes: BlendProbes
  • Material
    Shader: Standard シェーダー使用(リフレクションプローブ対応のシェーダー要)
    Reflections: チェック入れSmoothness: 1  ※1に近いほど映り込む。
    Metalic: 1 ※1に近いほど鏡面反射な映り込みになる。





追加補足

・CubemapのBake(?)に結構時間がかかる。
多分CubemapのBakeだと思われますが、生成に結構時間がかかる。
Unityウィンドウ右下ステータスバーにさりげなく進行状況が出てくるのでチェック。
その間もエディタは使えるし再生もできる。ただし再生してもまだ反映されてないので注意。
Bakeが終わるまで気長に待つしかなさそう。
※作業中はいろいろ間引いて高速化は可能だが、最終微調整はどうしても時間がかかる。

・リフレクションプローブが複数ある場合、近い方が優先してブレンド。

・1つのリフレクションプローブだけ映し込みたい場合は、そのオブジェクトの Mesh Renderer の Anchor Override に そのリフレクションプローブのオブジェクトをドラッグ&ドロップする。ないしはプルダウンで選択する。

・映り込ませる(反射)オブジェクトは staticである必要はないので移動できる。
ただし映り込み方に注意(Bakedの場合)。
リフレクション空間に突入すると映り込むようになる。
その際、そもそもリフレクションプローブのボックス6面に事前内部生成したテクスチャをリフレクションプローブの中心点で観測したように映り込ませる様子。
なので映り込まされるオブジェクトは、リフレクションプローブ空間内のどこに移動しても同じように表面に投影されている。つまり位置による補正が無いので周囲の景観具合やまじまじ見るとおかしいのがバレてしまう可能性がある。
ただカメラ視点変化での反射には追従してるので一見するとバレにくい。ここが軽量且つそれっぽくみせるコツかも。

・リフレクションしてるオブジェクトはさらに別なオブジェクトでリフレクションしない
  1. リフレクションプローブの効果で既に反射しているオブジェクトAがあるとする。
  2. その近くにもう1つ同じように反射しているオブジェクトBがあるとする。
  3. この時、オブジェクトBにオブジェクトAは映り込める位置にあるとしても、映り込まない。
映り込みは1世代までみたいです(なので軽量とも?)。この辺は利用時注意。
逆に意図的に「映り込ませない」ような演出にもできるかも?
※Blender等ではこのIllumination映り込みの反射回数指定みたいなのを有効化すると結局レイトレーシング計算していたような記憶。軽量化の為、反射ネスト1回まで演算はうなずけます。それでも結構な演算負荷に見えるので。

サンプルプロジェクト

簡単なサンプルをGitHubにアップロード。
使用環境:Unity5.4.2f1。
https://github.com/maruton/Sample_ReflectionProbe

画面右の「Clone and download」からプルダウン内「Download ZIP」で落とせます。



参考URL: リフレクションプローブリフレクションプローブの使用

この記事では「ユニティちゃん」コンテンツを利用した画像を含んでいます。 © UTJ/UCL




2016年8月30日火曜日

Polygon Fill ~ SubStance Painter


SubStance Painterの Polygon Fill機能と Quick Mask機能で簡単にメッシュ面を塗る方法。

こんな感じのものを塗ってみます。




メッシュのエッジ線を境目にちょっと塗りたい時に便利です。

■環境

SubStance Painter2.3.0

OS: Windows10pro バージョン1607(Build 14393.82)
CPU: i7-6700K
MEM: 32GB
GPU: GeForce GTX960(4GB)

※Polygon Fill機能、Quick Mask機能はVer1.xでも同じだと思います。


■モデル

Blenderで適当に作った以下のモデルを使って作業していきます。
OBJ形式で出力しておきます。





■新規プロジェクト作成

SubStance Painter2.2を起動。
CTRL+Nで新規プロジェクト作成ダイアログを開く。
Mesh の Selectボタンから先のOBJファイルを選択。
他の欄も以下のように設定し OK で進む。



以下のような感じになります。
ここで最初からある LayersウィンドウのLayer1は削除しておきます。


File>Save as... で適当なファイル名で保存しておきます。



■作業

ベースのマテリアルを設定

  1. Fill Layerを作成(Fill Layer 1)。
  2. 作成したFill Layerを選択。
  3. Materialsウィンドウから、Plastic Glossy Pure を選択。
以下のようにモデル全体が青のマテリアルで塗りつぶされます。



Quick Mask、Polygon Fill で塗る色の準備


前項と同じ要領で Fill layer を追加(Fill Layer 2)、マテリアルに SciFi PVC Plasticを設定。

Fill Layer 2上で右クリック>Add black mask。
マスクに何も描かれていない為この時点でモデルには Fill layer 1が反映されます。


Quick Mask、Polygon Fill で塗る

Fill layer 2のマテリアルで塗っていきます。

  1. Fill layer 2の black mask の四角をクリックして選択状態にします。
  2. 左上のツールアイコンから、Polygon Fill アイコンをクリックして有効にします。
  3. すると3D Viewのモデルにメッシュのエッジ線が見えるようになります。 
  4. さらにProperties - Polygon Fillウィンドウの Polygon Fillアイコンをクリックして有効にします。


  1. 塗る際はProperties - Polygon FillウィンドウColorスライダをめいっぱい右に寄せて1.0にします。(逆に消す時は左に寄せて0.0にして使う)

  2. 右クリック+ALTでだいたい真横からみえる位置に回転、さらにSHIFTも押下すると視点が正確に真横にスナップします。右クリック+ALT+SHIFTで視点角度が90度単位でスナップ)。
  3. 3D view上でTキーを押すと「Using quick mask」と表示されます。

    モデルの中央のみを選択するようにマウスでクリック&ドラッグで四角く囲います。
    囲ったメッシュ面がblack maskに自動的に書き込まれ、Fill layer 2のマテリアルが適用されます。
  4. このとき奥のメッシュも全て囲い対象になってしまう為、4隅のポールも一部選択されてしまいます。
    Properties - Polygon FillウィンドウColorスライダをめいっぱい左に寄せて0.0にします。
    4隅ポールの塗られてしまった部分をマウスドラッグで横長の四角で囲います。




最終的に以下のように目的のメッシュ面のみに Fill layer 2を適用できる black maskが出来上がります。




この要領で、

  • Fill layer + black mask
  • Polygon Fill
  • Quick mask
を使うとSubStance Painter上の作業だけで任意のメッシュ面のみにマテリアルを適用できます。


ちょっと塗りたい&メッシュ面境界で良い場合は便利です。



以下、他も塗った状態。



塗り絵感覚なのが簡単で良いですね。


Unityにインポートするとこんな感じ。














2016年8月28日日曜日

SubStance Painter2.2で表示される [GPUIssuesCheck] The current TDR~ を解決する

SubStance Painter2.2を起動すると以下のようなログが流れる場合があります。



指定のURLからallegorithmicのサイトに行けば解決方法(英語)が書かれていますが、レジストリを直接書き換える必要があります。
(製品ソフト使用でいきなりレジストリ書き換えというのは少々敷居が高い気もします・・・)



■環境について

OS: Windows10pro バージョン1607(Build 14393.82)
CPU: i7-6700
MEM: 32GB
GPU: GeForce GTX960(4GB)


■何が起きているのか?

以下問題のログメッセージ

[GPUIssueCheck] The current TDR (GPU hang recovery) delay is low 2s.
See http://support.allegorithmic.com/documentation/display/SPDOC/GPU+drivers+crash+with+long+computations


このTDRTimeout Detection and Recovery の略です。

GPUドライバ側でGPUがハングアップしたと判断する時間値(タイムアウト値)が2秒を示しています。
GPUが何らかの原因(熱や故障など)で一定時間以上応答しない時ハングアップしたと判断しGPUにリセット(?)をかけるようです。

この判定時間=タイムアウト値が2秒になってるということです。

そしてSubStance Painter2.2にとって2秒では「タイムアウト値が短すぎるかもしれない」とログでレポートしているわけです。



SubStancePainter2.2はGPUコア(GPGPU的な利用?)を活用しているようで、大きなテクスチャを扱う等の際に、その処理に時間がかかることがあるようです。
(特にテクスチャExport時に長時間GPUを使用するようです)

その際先のTDR値の2秒を超えると、ドライバ側でGPUがハングアップしたと検知されてしまい、処理が中断してしまうようです。

つまりこのTDR値を適切な値に設定しすれば良いということになります。
(ちなみに2秒はドライバ内デフォルト値)


■適切なTDR値は?


ちなみにこのTDR値を0にするとハングアップ検出がされなくなります。
これは本当にGPUがハングアップした際にOSを抱き込んで固まる危険性があります。
その場合PCのリセットボタンか電源をOFFにするしかなくなるので少々リスキーです。

しかしどれくらいに設定すれば良いかの推奨値は先の公式ページにも特に書かれていません。
極論どれくらいの処理をさせるか=作業をするかに依存しそうです。

ひとつの目安としてテクスチャサイズが関係しているようです。
ちなみに巨大なテクスチャで(4k?8k?以上とか)あまりに複雑なことをやるとGPUメモリが3~4GBでも不足するといった事態もあるらしいです。
(そもそもExportができないらしい?)

フォーラム(海外)などの情報では60~240~480などといった数値が散見されます。

まずは30か60程度に指定しておき、作業中にExportがうまくいかない等の状況が発生したら120、240~等に増やしていけば良いかもしれません。



■レジストリ書き換え作業

まず概要ですが、

  • タイムアウト値の設定箇所(キー)は2つあります。
    • TdrDelay
      GPUスケジューラからのGPU処理中断(タイムアウト)されるまでの猶予時間。単位は秒。デフォルト2秒。
      この値秒以上GPUの応答が無いとGPUがハングアップとみなされる。
      今回はTdrDelay値120に設定してみます。
    • TdrDdiDelay
      OSのスレッド処理がGPUドライバ処理中断を判断する時間。単位は秒。デフォルト5秒。
      今回はTdrDelay値125に設定してみます。※TdrDelay<TdrDdiDelayとなっているようなので、TdrDelayより少し長い程度に設定してみます。どうせGPUハングを検出したらアプリ側で長い間待っていても意味がない気がするので。
  • この2つのキーは初期状態では存在していないかもしれません
    その際はキーを作ります。
    データは DWORD です。
    (キーが存在していない場合はデフォルト値が使用されます)




以下書き換え作業手順。
  1. スタートメニュー右クリック>ファイル名を指定して実行 欄で regedit と入力してENTERキー押し。
    「このアプリがデバイスに変更を加えることを許可しますか」のダイアログでは「はい」を選択。
    レジストリエディタを起動。
  2. レジストリエディタ画面左のツリーで以下を辿り右画面に表示させます。
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDrivers
  3. TdrDelayが無い場合は作成します(ある場合は次へ進む)
    右画面の空白部分で右クリック>新規(N)>DWORD(32ビット)値(D)
    作成した行の上で、右クリック>名前の変更 でTdrDelay に変更。
  4. TdrDelayの行の上で右クリック>修正。
    「表記」で「10進数(D)」をクリック。
    値のデータ(V)で120と入力します。
  5. TdrDdiDelay についても同じ要領でキーが無ければ作成し、名前変更、値の修正をします。
  6. レジストリエディタを終了し、PCを再起動します。
 これで書き換え作業完了です。

SubStancePainter2.2を起動して問題のログが表示されなければうまくいっています。




■参考サイト

msdn.micrfosoft.com: TDR Registry Keys