Direct3D 12 は Metal や Vulkan と同じ低レベル API に属します。新しい API Set ですが、GPU の世代更新に合わせたというよりも Direct3D 11 世代の再定義に近いものでした。ShaderModel は 5.1 のままで、GPU の新機能対応も当初は 11/12 両方に行われています。

D3D API ShaderModel OS Windows 10
Direct3D 11.0 5.0 Vista/7
Direct3D 11.1 5.0 7/8
Direct3D 11.2 5.0 7/8.1
Direct3D 11.3 5.1 10
Direct3D 11.4 5.1 10 (1511) November Update
Direct3D 12 5.1 10
Direct3D 12 6.0 10 (1607) Anniversary Update
Direct3D 12 6.1 10 (1709) Fall Creators Update
Direct3D 12 6.2 10 (1803) April 2018 Update


Direct3D 11 の Release は Windows 7 と同時ですが、Windows 10 になっても 11.3/11.4 と更新が続いていたことがわかります。しかしながら Windows 10 1607 以降は ShaderModel 6.0 も導入されており、機能面での違いも増えてきたように思います。

コメントで Vega の ShaderModel 6.0 の対応状況について情報を教えていただいたので、あらためてそれぞれの GPU で確認してみました。新しい世代の GPU はいずれも最新ドライバで 6.1 に対応していることがわかりました。

GPU FL SM Driver
GeForce GTX 1070 Pascal 12_1 6.1 397.44
GeForce GTX 960 Maxwell 2 12_1 6.1 398.11
GeForce GTX 750 Ti Maxwell 1 11_0 6.1 398.11
RADEON Vega 56 GCN 5 Vega 12_1 6.1 18.5.1
RADEON RX 480 GCN 4 Polaris 12_0 6.1 18.5.1
RADEON R7 (A10-7870K) GCN 2 (1.1) 12_0 6.1 18.5.1
Intel HD Graphcis 530 (i7-6700K) Gen 9 12_1 6.1 23.20.16.4973


下記は ShaderModel 6.0 の wave 命令の lane 数

GPU min max total
GeForce GTX 1070 Pascal 32 32 30720
GeForce GTX 960 Maxwell 2 32 32 16384
GeForce GTX 750 Ti Maxwell 1 32 32 10240
RADEON Vega 56 GCN 5 Vega 64 64 3584
RADEON RX 480 GCN 4 Polaris 64 64 2304
RADEON R7 (A10-7870K) GCN 2 (1.1) 64 64 512
Intel HD Graphcis 530 (i7-6700K) Gen 9 8 32 768


その他 GPU 毎の対応状況の詳細は下記のページに載せています。

Direct3D 12 (DirectX 12) Windows 詳細


GPU は頂点や Pixel のように大量のデータを扱います。これは並列化が容易なので、CPU の Multi Thread と同じように複数の Shader Core で分散実行しています。

CPU と異なっているのは、一定の Thread Group (wave) 毎に実行する命令 (Instruction) を共有していることです。同じ Instruction で同じ演算を行うという意味では SIMD に近いのですが、各 Thread はそれぞれ単一の Scalar 要素にだけアクセスできるようになっています。これは SIMT と呼ばれています。

例えば 4 並列の SIMT を考えてみると、Thread 0 は SIMD Vector Register の x だけ、Thread 1 は y だけ使って演算を行っていることになります。コード上は Scalar 演算と同等です。

ShaderModel 6.0 の wave 命令では、この Thread 毎の Scalar アクセスの制限が緩和されており、ある程度相互に情報をやり取りできるようになりました。先程の例でいえば、本来 Thread 0 しかアクセスできない x の要素を Thread 1~3 からも参照できることになります。

なお ShaderModel 6.0 からは ShaderCompiler が変更されているようです。5.1 までは fxc.exe (D3DCompiler_47.dll) ですが、6.0 以降は dxc.exe (dxcompiler.dll) を使います。

dxc shader.hlsl -T ps_6_0 -E pmain -Fo shader_ps.bin


dxc でコンパイルした bytecode はそのまま PipelineState (D3D12_GRAPHICS_PIPELINE_STATE_DESC) に渡すことができます。

PS_OUT  pmain( VS_OUT pin )
{
    PS_OUT  pout;
    float2  pos= pin.Position.xy;
    if( WaveIsFirstLane() ){
        pos.x*= 1.0f/500.0f;
        pos.y*= 1.0f/500.0f;
    }
    pos= WaveReadLaneFirst( pos );
    if( WaveIsFirstLane() ){
        pout.Color= float4( 0.0f, 0.0f, 1.0f, 1.0f );
    }else{
        pout.Color= float4( pos.x, pos.y, 0.0f, 1.0f );
    }
    return  pout;
}


少々わかりにくいですが、上の PixelShader で Wave Size (Lane 数) の違いを視覚化してみたものです。同一 Wave を同じカラーで塗りつぶします。

null

↑左から RADEON Vega56, Skylake (Intel HD Graphics 530), GeForce GTX1070

Vega が最も Lane 数が多いので tile の色分けがわかりやすくなっています。真ん中の Intel HD Graphcis が最も細かいことがわかります。


関連エントリ
AMD Vega と Direct3D 12
Direct3D 12 GPU GeForce GTX 1070 Pascal と RADEON RX 480 Polaris


VR
oga at 21:20
Gear VR は Oculus Go と互換性のある VR Platform です。Samsung のスマートフォン Galaxy と組み合わせて使います。Gear VR HMD の仕様をまとめていたら予想以上に種類が多かったので分かる範囲で違いをまとめてみました。SM-R320~R325 までの 6種類あります。

Gear VR Name FOV Vol Home TypeC MC Weight
SM-R320 Gear VR Innovator Edition 2014 96度 Y - - - 379g
SM-R321 Gear VR Innovator Edition 2015 96度 Y - - - 393g
SM-R322 Gear VR 2015 96度 Y - - - 318g
SM-R323 Galaxy Gear VR 2016 101度 Y Y Y - 345g
SM-R324 Gear VR With Controller 2017 101度 Y Y Y Y 345g
SM-R325 Gear VR With Controller 2017 101度 - Y Y Y 345g

・Vol = HMD に Volume button あり
・Home = HMD に Home button あり
・TypeC = USB Type-C コネクタ対応 (MicroUSB と両対応)
・MC = Motion Controller 付属

それぞれの対応 Galaxy 一覧

Gear VR S6/S6E S7/S7E/Note5/S6E+ S8/S8+/S9/S9+ Note8 A8/A8+
SM-R320 - - - - -
SM-R321 Y - - - -
SM-R322 Y Y - - -
SM-R323 Y Y Y - ?
SM-R324 Y Y Y - ?
SM-R325 Y Y Y Y Y

・S6E,S7E = S6 Edge, S7 Edge

SM-R320 は Note 4 のみ対応で、今の GearVR / Oculus Go Application とは互換性が無いようです。よって現在利用可能な GearVR は SM-R321 以降になります。

Galaxy A8/A8+ (2018) も GearVR 対応ですが、どの HMD から使えるのか明確な仕様が見つかりませんでした。明記されているのは SM-R325 のみでした。

GearVR Motion Controller は単体で別売りしているので、付属していない SM-R323 以前の HMD でも利用可能です。

重さは HMD だけです。利用時はこれにスマートフォン本体の重さが加わります。SM-R321 が一番重いですが、このモデルだけファンが内蔵されていたようです。ちなみに Oculus Go は 470g。

スペック的には一番新しいものを選んでおけば間違いないと思われます。コントローラ付きは 16000円くらいするので、23800円で買える Oculus Go が安いことがよく分かります。

スペックは下記のページにもまとめています。

HMD VR / AR Device spec 一覧


● 仕様の参考にしたページ

https://www.samsung.com/us/business/support/mobile/virtual-reality/headsets/
http://www.galaxymobile.jp/support/skp/faq/1138409/
http://www.iodata.jp/product/samsung/other/sm-r322nzwaxjp/spec.htm
http://www.iodata.jp/product/samsung/gear/sm-r323nbkaxjp/spec.htm
http://www.iodata.jp/product/samsung/gear/sm-r324nzaaxjp/spec.htm
http://www.iodata.jp/product/samsung/gear/sm-r325nzvaxjp/spec.htm
http://www.samsung.com/uk/wearables/gear-vr-innovator-edition-r320/


関連エントリ
各種 VR HMD と Volume 調節の仕方まとめ
VR で物が大きく見えたり小さく見えたりするわけ
Oculus Go は VR ができる新しい携帯ゲーム機
Oculus Go と VR デバイスの種類


先日各種モバイルデバイスから Desktop PC までビルド時間の比較を行いました。

前回の記事はこちら: 「 ARM CPU 上の開発環境とコンパイル時間の比較 」

最初測定したときは 8 core 16 thread の Ryzen 7 1800X でビルドが 60秒かかっていました。何度試しても変わりません。3年前のスマートフォン Galaxy S6 edge が 77.8秒なので、おかしいと調べたところアンチウィルスソフトが原因であることがわかりました。uninstall した状態では 22秒まで短縮しています。2.7倍も高速になりました。

Ryzen 7 1800X Windows 10 x64 ビルド時間
追加アンチウィルスソフトあり 60.0 秒
Windows Defender 22.2 秒

uninstall しても Windows 10 では Windows Defender, Windows Firewall が有効になるため、決して無防備になるわけではありません。

実は前に仕事でも全く同じような問題がありました。ビルド時間があまりに長いために、独自にビルドシステムを作って並列度を上げたり、キャッシュ化や分散ビルドシステムを開発したりと様々な試みを行ったことがあります。あとから、アンチウィルスソフト (上記とは別のソフト) を無効化しただけで 2倍前後ビルド時間が短縮することが分かりました。

2.7倍差は大きいので、CPU の core 数を増やすよりも効果あるかもしれません。


関連エントリ
ARM CPU 上の開発環境とコンパイル時間の比較
AMD CPU Ryzen とコンパイル時間の比較 (2)
AMD CPU Ryzen とコンパイル時間の比較


VR
oga at 21:33
VR ゲームをプレイ中に音量調節する方法は機種によって様々です。専用の音量調節ボタンが用意されている場合もありますし、Home ボタンを使って専用のシステムメニューから調節するタイプもあります。HMD をかぶったままだとリアルの操作は難しいので、操作方法をまとめてみました。

VR ヘッドセットでゲーム中にボリューム調節する方法のまとめ

Device 専用
ボタン
Sys
Menu
Volume 調節方法
HTC Vive N Y Steam ボタンを押して右下のスライダで調節
Oculus Rift 新パッケージ N Y Oculus ボタン押して Volume アイコンから変更
Oculus Rift 初期パッケージ Y Y 付属ワイヤレスリモコンの Volume ボタン
Windows MR Odyssey Y Y HMD にボタンあり
Windows MR 各種 N Y Win ボタン → Win ボタン Menu → 音量アイコン
Sony PSVR ZVR2 新型 Y N HMD にボタンあり
Sony PSVR ZVR1 Y N ケーブルの途中にリモコンあり
Gear VR SM-R320~R324 Y N HMD にボタンあり
Gear VR SM-R325 Y N Motion Controller の Volume ボタン
Oculus Go Y Y HMD の Volume ボタン
Daydream Y N Motion Controller の Volume ボタン
Vive Focus Y ? Motion Controller の Volume ボタン


ソフトウエア設定のみ HTC Vive, Oculus Rift, Windows MR (Odysseyを除く)
コントローラに音量あり Daydream, GearVR, Vive Focus
HMD に音量ボタンあり PSVR ZVR2, GearVR SM-R320~R324, Odyssey, Oculus Go, Mirage Solo
リモコンのボタンあり PSVR ZVR1, Oculus Rift 初期パッケージ

専用のボタンが用意されている場合でも、HMD を付けたままだとボタンの位置をなかなか探せないことがあります。システムメニューが音量調節に対応している場合は、そちらを使った方がわかりやすいかもしれません。

Windows MR は音量調節に少々手間がかかります。Windows ボタンで Home に戻ったあと、もう一度 Windows ボタンでスタートメニューを表示させてから右上の音量アイコンで変更します。ボイスコマンドにも対応しているらしいのですが、Windows MR の大半は HMD に標準でマイクが付いていないので残念です。

Home からゲームに復帰するにも、メニューからアプリのアイコンを探すか配置してあるウィンドウまで移動してクリックしなければならず思ったより簡単ではありませんでした。SteamVR のタイトルを遊んでいる間はスティック押し込みで SteamVR の Steam Menu が使えるので、こちらの方がおすすめです。ゲームにも簡単に戻れます。

GearVR は使用する HMD によって異なっているようです。SM-R324 から Motion Controller が付属するようになり、SM-R325 から HMD 側のボリュームボタンが無くなっています。

Daydream は Controller 側の音量ボタンを使用します。メニューでは調節できませんがミュートがありました。


関連エントリ
VR で物が大きく見えたり小さく見えたりするわけ
Oculus Go は VR ができる新しい携帯ゲーム機
Oculus Go と VR デバイスの種類


VR
oga at 23:07
様々な VR HMD やコンテンツを体験していると、本来リアルなシーンなのに人や風景が人形のように小さく見えることがあります。反対に、周囲に巨人が動き回っているように見える場合もあります。その原因は視差の違いにあります。

目と目の間隔は個人差があります。そのため、同じコンテンツでも視差による感じ方は人によって異なってきます。


● 視差と距離感

普段見ている景色は遠くにあるものほど視差が小さくなります。よって VR 空間内でも視差が現実よりも小さい場合は、物体が遠くにあるように感じます。

その極端な例が視差が無いモノラルな 360度写真や 360度動画です。VR で巨大な人が周りに立っているかのような 360度写真を何度か見たことがあるのではないでしょうか。

視差が無いということは現実だと極めて遠くにある場合に相当します。遠くにあるはずなのに、近くにある場合と変わらない大きさで見えているのだから「これは非常に巨大なものであるに違いない」と脳が勘違いしてしまうわけです。

逆に視差が大きいときは、より手前にある場合に相当します。近くにあるのに遠くにあるときと同じ大きさに見えているのだから、とても小さいものがそこにあるのだと感じてしまいます。


● 目と目の間隔 IPD

目と目の間隔 (IPD = 瞳孔間距離) は見え方に影響を与えます。個人差があるため、多くの VR System では目の間の距離を調節する仕組みが備わっています。IPD には 2種類あります。

物理 IPD HMD のレンズやモニタ間の距離
レンダリング IPD 仮想空間内に配置した、両目のカメラ間の距離

ハイエンド系の VR HMD では、直接物理 IPD を調節するための仕組みが用意されているものがあります。HTC Vive では右下にダイヤルが付いており、Oculus Rift でもスライドスイッチで調節することが可能です。この調節した値は API から読み取ることが可能で、レンダリング IPD にそのまま反映されます。

レンズを見やすい位置に調節できる上に、レンダリング IPD にも自動的に反映されるため手間がかかりません。逆に見かけの大きさに違和感があっても、物理 IPD とレンダリング IPD を意図的にずらすことができなくなっています。

物理 IPD の調節ができない機種でも、ソフトウエア的にレンダリング IPD の設定ができるものがあります。PS4 の PSVR では、設定の中に目と目の距離を測定するための機能が用意されています。Windows MR ではもっと単純で、設定画面の中で IPD を直接数値入力することができます。

Device 物理 IPD 調節 レンダリング IPD
HTC Vive ダイヤル 物理 IPD に連動
Oculus Rift スライドスイッチ 物理 IPD に連動
PSVR なし 目と目の距離測定機能
Windwos MR なし 設定画面で数値入力


●大きさの違和感を解消するための調節

VR 空間内で人や物の大きさが大きすぎたり小さすぎると感じる場合は、現実と IPD の値がずれていると考えられます。個人差があるので、他の人にはちょうどよく見える場合も自分には小さかったり大きく感じたりする場合があります。

大きく見える場合は視差が小さいので、レンダリング IPD を増やします。もし小さく見える場合は視差が大きいので、レンダリング IPD を減らす方向に調節します。

ただし、HTC Vive や Oculus Rift のように物理 IPD とレンダリング IPD が連動している場合はこの調節ができません。物理 IPD はレンズを通して映像が一番見えやすい位置に調節すべきで、レンダリング IPD だけ意図的にずらすことができないからです。

PSVR は数値入力できないので、目と目の距離を測定するツール上で調節することになります。少々手間がかかるのですが、「設定 → 周辺機器 → PlayStation VR → 目と目の距離を測定する」で写真から目の中心を割り出すときに、瞳の中心から外してあえて狭くしたり、広げることで調節ができます。

Device レンダリング IPD だけの微調整
HTC Vive なし
Oculus Rift なし
PSVR 目と目の距離を測定するツールで、間隔をずらす
Windwos MR 設定画面で数値入力

個人差があると思いますが、自分の場合 IPD をきちんと設定しても Oculus Rift は Vive よりもわずかに大きく見える傾向がありました。ただしどちらも比較的違和感が無い範囲での違いです。PSVR は全体的に小さく見えていました。Windows MR は一部の HMD しか試していませんが違和感ありませんでした。


なお、このようなレンダリング IPD 調節が有効なのはあくまで、ゲームのように 3D でリアルタイムレンダリングを行っている場合だけです。プリレンダリングされた動画や、実写の 360度動画や 360度写真は、撮影時にカメラ間の距離が決まってしまいます。コンテンツに依存するためあとから IPD を変更することができません。

ポジショントラッキング対応の HMD でも、ムービーでは頭の位置を水平に動かすことができないのと同じです。個人差があることを踏まえても、より良い VR 体験には リアルタイム 3D は欠かせない要素となっていると言えるでしょう。


関連エントリ
Oculus Go は VR ができる新しい携帯ゲーム機
Oculus Go と VR デバイスの種類


| 次のページ(日付が古い方向)>>