Creators Update以降のDirect3D12の更新やXbox One Xのフィーチャーに関する記事

先日,Windows 10 Fall Creatorsがリリースされビルド1709向けの新しいDirect3D12 APIが加わりました.

Direct3D12の新機能のリリースノート
https://msdn.microsoft.com/en-us/library/windows/desktop/mt748631(v=vs.85).aspx

今回加わった新機能のほかに,1つ前の大型アップデートであるCreators Updateなどで加わった新機能の一部についてDirectX Developer Blogで紹介されています.Xbox One Xの話題が少し序文で触れられているので,これらの機能はその開発でも役に立つのかもしれません.

Announcing new DirectX 12 features
https://blogs.msdn.microsoft.com/directx/2017/11/07/announcing-new-directx-12-features/

Fall Creators Updateでの更新では,Direct3D12がCPUにとって低遅延なAPIになったことで,CPUはGPUにコマンドを送ったらハードウェア(GPU)上で何が起きているか把握するのが難しくなりました.特にGPUクラッシュなどは原因の追及が難しくなっています.

改善された機能については,データとコマンドの観点で新しいAPIが紹介されています.

  • ID3D12Device3::OpenExistingHeapFromAddress
  • ID3D12GraphicsCommandList2::WriteBufferImmediat

Id3d12device3::OpenExistingHeapFromAddress
https://msdn.microsoft.com/en-us/library/windows/desktop/mt813612(v=vs.85).aspx

ID3D12GraphicsCommandList2::WriteBufferImmediate method
https://msdn.microsoft.com/en-us/library/windows/desktop/mt844818(v=vs.85).aspx

データに関しては,リソースメモリに対してアクセスできるID3D12Device3::OpenExistingHeapFromAddressという関数が追加されたようですね.これを使うと診断用のDescriptor Heapが取れるようで,システムメモリ上に作られるようなのでGPUのクラッシュやデバイスロスト時でも見ることができるようですね.

コマンドという観点でいうとID3D12GraphicsCommandList2::WriteBufferImmediate をCPUから送られたコマンドが実行されたかどうかや実行中かというところがわかるマーカーを打てるようになったようですね.これはクラッシュ時でも取れるようなので,実際にクラッシュしたコマンドを把握するのに便利なようです.

Creators Updateで追加されたものに関しては,以下の2つについて紹介されています.

  • Depth Bounds Testing
  • Programmable MSAA

Depth Bounds Testingはピクセルがカメラからどれだけ離れているかテストする機能であまりに遠すぎるものは破棄するなどができるようになります(設定できる値はmin,maxなので一定の範囲より手前のものも設定はできます).この機能自体は,昔からGPUで備わっていましたが,Direct3D12の初期段階ではAPIがなかったため使えませんでした(過去の世代では使えていました).

Depth Bounds Testingに関しては,GitHubでサンプルが公開されています.

サンプル
https://github.com/Microsoft/DirectX-Graphics-Samples

Programmable MSAAではアンチエイリアス処理の制御をより柔軟にするためにサブピクセルの動作を指定するような命令が加わったようで,フレームごとにずらすことでTemporal AAなどの悪い影響を防ぐようなことにつかえるようですね.

APIとしてはID3D12GraphicsCommandList1::SetSamplePositionsに対応するようです.

ID3D12GraphicsCommandList1::SetSamplePositions method
https://msdn.microsoft.com/en-us/library/windows/desktop/mt492660(v=vs.85).aspx


Draco : Googleによるオープンソースの3Dデータ圧縮ライブラリ

Googleが3Dデータ向けの圧縮のためのオープンソースライブラリDracoを公開していました.

Draco
https://google.github.io/draco/

リポジトリ
https://github.com/google/draco

3DグラフィックスAPI向けにデータを流しやすくということのようですね.通信がありブラウザで使われるWebGL(Three.jsで対応)やglTF, WebVRなどの分野では圧縮は意義がありそうですね.

Dracoについては,glTF 2.0の圧縮形式としてKHR_draco_geometry_compression拡張が提案されているようですね.

Comment period for Draco extension
https://github.com/KhronosGroup/glTF/issues/1114


Direct3D12 OpenEXR読み込みサンプルを追加しました

ArticlesにDirect3D12 でOpenEXRの画像を直接読み込むサンプルを追加しました.

以前の記事でDDSの読み込みをやったので通常はDDSがあれば足りるのですが,ツールなどで直接開きたいなどの時のために直接のロード処理を書きました.

次回のDirect3D12ネタはいったんテクスチャを離れる予定ですが,このネタに関しては将来的にHDRディスプレイ上でHDRフォーマットのテクスチャを表示するようなネタに昇華していく予定です.

DirectXTex : OpenEXRのテクスチャへの読み込み


CppCon 2017 : Design Patterns for Low-Level Real-Time Rendering

CppCon 2017でDesign Patterns for Low-Level Real-Time Renderingというセッションがあったようですね.

Design Patterns for Low-Level Real-Time Rendering(スライドアリ)
https://cppcon2017.sched.com/event/BgtO?iframe=no

Vulkan, Direct3D 12, Metalといった並列処理対応グラフィックスAPIにおいて

  • メモリ管理
  • コマンドリスト
  • Descriptors
  • リングバッファ
  • 並列コマンドレコーディング
  • GPU処理の並列化とメモリのスケジューリング

などの話題がメインのようです.

参考文献などを見ているとやはりGDC 2017のEA DICEのFrameGraphの影響は大きそうですね.


書籍:Metal Programming Guide: Tutorial and Reference via Swift

OpenGLの赤本を出版している出版社から”Metal Programming Guide: Tutorial and Reference via Swift”が出るようですね。

出版社の紹介ページ
https://www.pearson.com/us/higher-education/program/Clayton-Metal-Programming-Guide-Tutorial-and-Reference-via-Swift/PGM1255392.html

目次を見ているとPart IIIでは画像処理,Machine VisionといったGPUの応用処理のほかにMetal特有のニューラルネットワーク関連のGPUアクセラレーションの話題が載るようですね.

CUDAなどではこうしたフレームワークがありますが,世代の近いDirect3D12やVulkanではこうしたフレームワークはないのでMetal特有の話題ということで興味深いですね.

Part III: Data Parallel Programming

Chapter 15: The Metal Compute Pipeline
Chapter 16: Image Processing in Metal
Chapter 17: Machine Vision
Chapter 18: Metal Performance Shaders Framework
Chapter 19: Neural Network Concepts
Chapter 20: Convolutional Neural Networks


AMD GPU Services (AGS) library 5.1リリース

AMD GPU Services (AGS) library 5.1が公開になっています.

https://github.com/GPUOpen-LibrariesAndSDKs/AGS_SDK

このライブラリはグラフィックスAPIがサポートしないAMD GPUの各種機能を使えるようにするSDKですが,5.1では

  • Radeon GPU Profiler,VS 2017対応
  • DX12対応
  • FreeSync 2 HDRディスプレイ対応
  • wave-level shader intrinsicsの追加

UE4やUnityなどを使用している開発者にもメリットがあるようですね.


Shader Model 6 Wave Intrinsicsサンプル

Shader Model 6 Wave Intrinsics サンプルを起動してみました.

https://github.com/Microsoft/DirectX-Graphics-Samples/tree/master/Samples/Desktop/D3D12SM6WaveIntrinsics

このサンプルでは,付属のCompileShader_SM6.batでシェーダをdxc.exe(HLSL 6.0用シェーダコンパイラ)でシェーダをコンパイルする必要があります.

Visual Studio 2017と10.0.15063.0のWindows 10 SDKがインストールされていれば下記にコンパイラがあると思います.

C:\Program Files (x86)\Windows Kits\10\bin\10.0.15063.0\x86\dxc.exe

ビルドを実行すると1~9までのレンダリングモードがあります.これでWave(NVIDIAならWarp, AMDならWavefront)やLane(Wave内の1スレッド)の処理を可視化します.

WaveやLaneなどの用語を再確認したい方は下記の記事のTerminologyを参照ください.

https://msdn.microsoft.com/en-us/library/windows/desktop/mt733232(v=vs.85).aspx

今回はすべての処理がピクセルシェーダで実装されています.

今回,GeForece GTX 1080で実行していますがWave内のLaneの数はGPUベンダーごとに違うのでAMDでは違う結果になると思います.

1.通常の描画

これがまず基本になります.Wave処理ありません.

2.Color Pixels by lane indices

これはカラー塗ってるピクセルのところをLaneのインデックスを表示しています.0~Wave数までのグラデーションになっているます.Wave内のLaneの割り当てられ方がわかります.

3.Show first lane (white dot) in each wave.

これは,Waveの単位の中で最初のLaneを白ピクセルで表示ています.

4.Show first(white dot)  and last(red dot) lanes in each wave.

これは前述のWaveの最初のLaneが白,最後とのLaneが赤で表示しています.

5.Color Pixels by active lane ratio (white = 100%; black = 0%)

カラーピクセルのあActive Laneの比率の可視化です.白が100%で黒が0%です.

6.Broadcast the color of the first active lane to the wave

これは,実行されてる最初のActive Laneの色をWave内のほかのLaneにブロードキャストしてその色を出力しています.

7.Average the color in a wave.

Wave内のLaneの色の平均を出しています.

8.Color pixels by prefix sum of distance between current and first lane.

これは,シェーダを見た感じでは現在のピクセルの座標値とWaveの最初のLaneの距離を取りその値をWavePrefixSumでLane内のすべての値で和をとっています.そのあとに,Wave内のActive Laneを取得して割って色を出しています.

9.Color pixels by their quad id

これ以前は,Wave単位で処理してましたがここでは2×2のLaneのQuad単位の処理を行っています.この処理では,Quad内の左上,右上,左下,右下と位置によって出力色を変えて出しています.