カテゴリー別アーカイブ: Direct3D

Syysgraph 2018のEA SEED の発表 Modern Graphics Abstractions & Real-Time Ray Tracingのスライド

Syysgraph 2018のModern Graphics Abstractions & Real-Time Ray Tracingスライドが公開になっています.

Modern Graphics Abstractions & Real-Time Ray Tracing
https://www.ea.com/seed/news/syysgraph-2018-modern-graphics-abstractions-real-time-ray-tracing

今年のHalcyonの発表は色々とありましたが,集大成的な発表になっています.

  • Vulkan版対応の話
  • Render Graphの話
  • マルチGPUでのGPUの仮想化
  • Machine Learning対応
  • アセットパイプライン
  • シェーダ
    • マルチプラットフォーム対応
    • Wave / Subgroup対応
  • レイトレーシング
  • ハイブリッドレンダリング
  • Transparent Shadow
  • Transparency & Translucency
  • GI
  • デノイズ

WHLSL : Web向け高級シェーダ言語

ブラウザ向け3Dは現在WebGLが使われていますが,WebKitやMozillaやGoogleなど様々な次世代APIが検討されています.

そこで使うシェーダ言語の1つとしてHLSLをベースにしたWHLSLの開発が進んでいますが,その詳細を解説した記事があります

Web High Level Shading Language
https://webkit.org/blog/8482/web-high-level-shading-language/

WHLSLに関しては,SIGGRAPH 2018のBoFのHLSL Realtime Shading Languageで知りました.BoFの説明ではW3Cというのがありますね.

SIGGRAPH 2018のBoFリスト
https://s2018.siggraph.org/conference/conference-overview/birds-of-a-feather/

さて,今回は,WebKitの話ですが,WebKitではAppleを中心にWebGPUというAPIが提案され現在開発が進んでいます.

WebGLはOpenGLをベースにしていましたが,WebGPUはMetal, Direct3D12, VulkanなどのAPIの設計をWebに持ってくるようなイメージですね.

AppleはWebGPUの実装をMetalベースで提案していましたが,他のOS環境に関してはDirect3D12やVulkanでの実装を行ってよいようでした.シェーダ言語に関しては,Metal Shadering Laungage(MSL)で提案していましたが,今回の記事を見ているとMSLはなくなったように思えます.

プロポーザル
https://webkit.org/wp-content/uploads/webgpu-api-proposal.html#shadinglanguage

今回の記事では,HLSLの構文を参考にしたWHLSLが説明されています.HLSLを参考にしているのはシェーダプログラマの人口が多いというところになりそうです(MSLやGLSLやSPIR-Vなど採用されなかったものについては記事に書いてあります).

ここで注意しないといけないのがWHLSLはHLSLと単語が共通ですが,HLSLの仕様がまるまる採用されておらず,言語仕様的には別な言語になっているようですね.Web High Level Shading Launguageということです.

ベクトル型や組み込み関数などは共通するようですが,HLSLでサポートする仕様とはいくつかの点が違いますがそれを挙げていきます(順不同.これが全部ではないです).

  • Cスタイルの暗黙の型変換はサポートしない
    • エラーの原因.Swiftなどと近いアプローチ
  • enumのサポート
    • 実行時のコストがかからず便利だから
  • 構造体
    • HLSLやCと一緒
    • 継承,virtual,アクセス制御,privateはサポートしない
  • プリプロセッサはサポートしない
    • 理由:プリプロセッサでシェーダのバリエーションを増やす手法はHLSLでは使われるが保守性が悪い
  • セーフポインタ
    • 既存のCPUコードの移植しやすさを考えて
      • 機械学習やComputer Vision,信号処理の人たちがコードをもっていきやすいように
  • 配列の参照
  • プロパティ
  • プリプロセッサの未サポート
    • HLSLでは1つのシェーダコードのバリエーションを増やすために使われるが保守性の悪さ
    • シェーダ読み出しの仕組みが違うのではサポートしない
    • 代わりにSPIR-Vのspecialization constantsにあたるものがある
  • セマンティクスのサポート
    • シェーダステージ間をやりとりするためにHLSLと同じくある
      • ただし,グローバル変数ではなく関数のパラメータ入力と出力の形式になる

だいぶ作業が進んでるなという印象ではありますが,ブラウザ上での実装はセキュリティの問題など配慮すべきことが多いためまだまだ時間がかかりそうではありますが,WebGLよりもよりパフォーマンスを引き出せるものというのを期待したいところですね.

ShaderConductor : Microsoftのオープンソースシェーダ言語変換ツール

MicrosoftがShaderConductorというシェーダ変換ツールを公開しています.

ShaderConductor
https://github.com/Microsoft/ShaderConductor

このツールは,HLSLから以下のシェーダを出力ができるものになっています.

  • DXIL (Direct3D12)
  • SPIR-V (Vulkan)
  • GLSL (OpenGL)
  • ESSL (OpenGL ES)
  • MSL (Metal)
  • HLSL (Direct3D9/10/11)

DXILとSPIR-V はDirectXShaderCompilerから出力を行い,残りはSPIR-VをSPIR-V-Crossを使って出力するというものになっています.

DirectXShaderCompilerによるVulkan向けSPIR-V出力に関しては下記の記事などが参考になると思います.EA SEEDの事例ですがVulkan向けのシェーダをHLSLで開発する話があります.DirectXShaderCompilerからのフローはだいぶ完成度が高まっている感じはあります.

Running Microsoft FXC in Docker
https://www.wihlidal.com/blog/pipeline/2018-09-17-linux-fxc-docker/

Khronos Munich 2018 – Halcyon and Vulkan
https://www.ea.com/seed/news/khronos-munich-2018-halcyon-vulkan

日本語での関連記事は新masafumi’s Diaryの方で書いています.

EA SEEDのHalcyonのDirect3D12やVulkan向けのシェーダの話
http://masafumi.cocolog-nifty.com/masafumis_diary/2018/10/ea-seedhalcyond.html

HalcyonのVulkan対応の話
http://masafumi.cocolog-nifty.com/masafumis_diary/2018/10/halcyonvulkan-c.html

NVIDIAのRTX向けレイトレーシングのサンプル集

NVIDIAがGitHubでGettingStartedWithRTXRayTracingというRTXのサンプルを公開しています.

GettingStartedWithRTXRayTracing
https://github.com/NVIDIAGameWorks/GettingStartedWithRTXRayTracing

NVIDIAのレンダリングフレームワークのFalcor上で以下のようなサンプルやDXRのチュートリアル的サンプルがあります.

  • 01-OpenWindow
  • 02-SimpleRasterShader
  • 03-RasterGBuffer
  • 04-RayTracedGBuffer
  • 05-AmbientOcclusion
  • 06-TemporalAccumulation
  • 07-SimpleAntialiasing
  • 08-ThinLensCamera
  • 09-LambertianPlusShadows
  • 10-LightProbeEnvironmentMap
  • 11-OneShadowRayPerPixel
  • 12-DiffuseGlobalIllumination
  • 13-SimpleToneMapping
  • 14-GGXGlobalIllumination

DXRサンプルは2つです.Ray Tracing In One WeekendをDXRでやるサンプルもあります.

  • DXR-RayTracingInOneWeekend
  • DXR-Sphereflake Better

このサンプル自体はWindows 10 RS4を対象にしたもののようでRS5では動作しないようなのでそこは少し待つ必要がありそうです.

NVIDIA TuringアーキテクチャのGPUの詳細記事やWhitepaper

NVIDIAの開発者向けサイトでGeForce RTXシリーズのTuringアーキテクチャのGPUの技術的な詳細を紹介した記事とWhitepaperが公開されています.

NVIDIA Turing Architecture In-Depth
https://devblogs.nvidia.com/nvidia-turing-architecture-in-depth/

Whitepaper
https://www.nvidia.com/content/dam/en-zz/Solutions/design-visualization/technologies/turing-architecture/NVIDIA-Turing-Architecture-Whitepaper.pdf

今回のアーキテクチャの刷新は新機軸が多いので読んでおくとよさそうですね.

ラスタライズ向けの新機能の4つですが,これらに関してはおいおい紹介していきます.

  • Mesh shading
  • Variable Rate Shading
  • Texture Space Shading
  • Multi-View Render

このうちMesh ShadingとVariable Rate Shading (VRS)にTwitterで取り上げられてますね.

IntelのCheckerboardレンダリングの記事

IntelのサイトでCheckerboardレンダリングの記事とサンプルが公開されています.SIGGRAPHでもセッションがありました.

Checkerboard Rendering for Real-Time Upscaling on Intel Integrated Graphics, v. 12
https://software.intel.com/en-us/articles/checkerboard-rendering-for-real-time-upscaling-on-intel-integrated-graphics-v-12

サンプルリポジトリ
https://github.com/GameTechDev/DynamicCheckerboardRendering

Direct3D12向けの実装解説で,先行するSonyのPS4 Proで提案されている手法,Rainbow Six Siege,Decima engine,Frostbiteの手法などについても言及されておりPC上で実装が公開されたものとしてはまとまった資料になっていますので実装を学ぶには良いと思います.

Coarse Pixel Shading with Temporal Supersampling組み込みメモ

はじめに

IntelがI3D 2018で発表した”Coarse Pixel Shading with Temporal Supersampling”(CPS-T)はCheckerboard Renderingに代わる手法になるか気になりまして読んでみました.

Coarse Pixel Shading with Temporal Supersampling
https://software.intel.com/en-us/articles/coarse-pixel-shading-with-temporal-supersampling

この手法は,Checkerboard Renderingと比較して以下のような利点があるとのこですのでその辺見ていきます.

  • Checkerboard Renderingより組み込みが楽
  • Checkerboard Renderingより品質が高い
  • Checkerboard Renderingより速度が速くなるケースがある

手法について

サイトで公開されているデモはMicrosoftのMiniEngineのTemporalBlendCS.hlslを置き換えるような形のものになっています.そのためTemporal Anti-Aliasing(TAA)を実装している環境であれば置き換えが楽にできるようですね.Convert_TAA_to_TS.pdfという移行ドキュメントがデモに入っています.

この手法は,Intelが2011年に発表した”Coarse Pixel Shading”(CPS)の考え方をベースにしていますが,CPSをハードウェアに実装したGPUは現在のところ無いのでいくつか現在のGPUのシェーダで代替できるような回避がされています.

Coarse Pixel Shading
https://software.intel.com/en-us/articles/coarse-pixel-shading

CPS-Tでは,GPU機能のCPSが使えない代わりに1/4の解像度にシェーディングして,前のフレームのレンダリング結果を利用して解像度を復元します.

この復元の手法はTAAに影響を受けてTemporal Supersamplingという手法が生み出されています.このTemporal SupersamplingはTAAのように前のフレームや動きがあるところはMotion Vectorなどを使用しますが,そのほかに低解像度から高解像度化する際の可視性をうる方法としてdecoupled samplingを使用しているということのようですね.

Decoupled sampling for graphics pipelines
http://people.csail.mit.edu/jrk/decoupledsampling/

パフォーマンスについて

論文の中のTable 1と2を見てみます.

Table 1では3つの背景データをライト数変えた結果でBistro(光源は太陽光の1ライトのみ), Sponza(128ライト), San Miguel(128ライト)となります.

Tableの1番左の項目は以下のようなものになります.

  • PS…すべてのピクセルをそのままシェーディングする
  • CBR…Checkerboard Rendering
  • CPS-T…今回の手法

レンダリングの中のZ-prepass, Lighting, Temp-Resolv(PSではTAAの速度)の速度やPS Invoc.(Pixel Shader Invocation.Pixel Shaderの実行回数)などが提示されています.Frame Totalがレンダリングの合計時間です.

Table 1を見て分かることはライトがSunlightのみの状況ではPSが一番速いという結果になっています.逆にライト数が128個のシーンではCPS-Tが勝っています.速度差が大きく出ているのはLightingの個所ですね.なぜ速度差が出るかというとPS Invoc.がCPS-Tが少ないという点にあります.

PS Invoc.が少ない理由としてレンダリングの解像度が1/4になっている点ですね.これによってライトが増えてPixel Shaderの中でライティング計算が増えますが,PSの呼び出し回数が少ないことが効いて速度差がでているわけですね.


Table 1

Table 2はシーンを1つのものに固定してライト数を32~512に変えて比較しています.ライトの数が増えるとごと速度差が出てきます.


Table 2

この結果をみたところPS Invocationの数が少ないことで,1つのシェーダの複雑度が高いケースで速度的なアドバンテージがあることがわかります.

CPS-TはCBRよりもライティングの計算にかかる部分を減らすことで速度を稼ぐというところがポイントになると思います.逆にPSがシンプルであれば速度的なアドバンテージはないとも言えます.

制限

Temporalな手法なので,新たなシーンでは品質の高い絵が出るまで数フレームかかることと動きのあるシーンでは,状況によってはゴーストがでるようなことはあるようですね.サンプルではあまり動的物が少ないので動きのあるものはそれぞれ検証された方がよさそうですね.

おわりに

制限の部分が気になりますが,組み込み自体はTAAを利用しているタイトルでは組み込みは楽かもしれません.CPSに影響を受けていますが,シェーディング自体は1/4でやるだけなのでCPSではなかったりしてTemporal Supersamplingが新しい発明といえるかもしれません.

パフォーマンスのところで書きましたが,速度差がでない環境というのがあるのでモバイルやGPUパワーが弱くシェーダが単純なものの速度を稼ぐには使えないと思います.

しかし,コンソールやPCのハイエンド機などでは面白い手法かもしれないのでTAAをすでに実装しているような環境やCBRの環境では一度載せ替えを試してみるのはいいかもしれませんね.

弱点もありますが,この手法の使いやすさから採用してくるタイトルが今後出てくるかや弱点の改善をした手法などが出てくるかが気になるところですね.

Digital Dragonsの発表 : HDR in Call of Duty

ポーランドのゲーム開発者カンファレンスでのDigital DragonsのActivisionの発表”HDR in Call of Duty”のスライドが公開されています.

HDR in Call of Duty
https://research.activision.com/t5/Publications/HDR-in-Call-of-Duty/ba-p/10744846

スライドは今まで見てきたHDRのワークフロー紹介するものの中では決定版のような内容でアニメーションが入っているのでフルスクリーンでアニメーション再生アリで見るのをお勧めします.

IntelのI3D 2018論文”Coarse Pixel Shading with Temporal Supersampling”の実装とシェーダ公開

IntelのI3D 2018論文”Coarse Pixel Shading with Temporal Supersampling”の実装デモとシェーダが公開になっています.

以前から論文は公開されていましたが,実装したデモプログラムとシェーダが公開になっています.

Coarse Pixel Shading with Temporal Supersampling
https://software.intel.com/en-us/articles/coarse-pixel-shading-with-temporal-supersampling

この手法は現在の4Kコンソールゲーム機で使われているCheckerboard renderingのようにピクセルを削減できるテクニックですが,処理時間が少し速く品質が良いということだそうです.

サンプルプログラムの起動はコマンドライン引数を与える必要があるので添付のreadmeのPDFは読んでおくことをお勧めします.