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

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

WWDC 18セッション”Metal for Game Developers”の動画とスライド

WWDC 18セッション”Metal for Game Developers”の動画とスライドが公開になっています.

Metal for Game Developers
https://developer.apple.com/videos/play/wwdc2018/607/

スライドの内容としては,

  • マルチコアを活用するコマンドバッファの積み込み
  • MetalでのAsync Compute
  • GPU Driven RenderingとしてMetalでのIndirect Drawなどのテクニックも解説されています
  • iOSデバイスのGPU A11のタイルシェーディングに最適化したレンダリングやプログラマブルブレンディング
  • FortniteのmacOS版,モバイル版のスケーラブルなグラフィックス

WWDC 18 “Metal for Ray Tracing Acceleration”セッション動画とスライド公開

WWDC 18の”Metal for Ray Tracing Acceleration”が公開されています.

Metal for Ray Tracing Acceleration
https://developer.apple.com/videos/play/wwdc2018/606/

AppleのOSでもMetalベースのレイトレーシング環境の概要と使い方が紹介されています.GPUを使用す部分はMetal Performance Shadersで記述ができるようですね.

外付けのeGPUを使ったマルチGPUへの処理の分散などへの対応の話もありますね.

fg : FrameGraphを参考に作られたオープンソースのグラフベースのレンダータスクシステム

GDC 2017のFrostbiteの”FrameGraph: Extensible Rendering Architecture in Frostbite”の発表を参考にしたオープンソースのグラフベースのレンダータスクシステム”fg”がGitHubで公開されています.

fg
https://github.com/acdemiralp/fg

FRAMEGRAPH:Extensible Rendering Architecture in Frostbite(元の発表)
https://www.ea.com/frostbite/news/framegraph-extensible-rendering-architecture-in-frostbite

FrameGraphは,現在のDirect3D12, Vulkan, MetalといったAPI上でのレンダリングエンジンの設計などでよく引用されますが,それを実装してみようという試みは面白いですね.

デバッグ用にGraphVizでの可視化に対応しているようですので,レンダーグラフのビジュアライズなんかもできるようです.

Next Stepsなどを見ていると非同期のレンダリングタスクやリソースバリアのAliasing barriersに対応していないようですが,そのあたりが対応してくるとあとは下のレイヤーは各APIの実装入れれば使えそうですね.

GPU Zen 2執筆者募集とDX12/Vulkan/Metal 2対応フレームワーク The Forge

Wolfgang Engel氏が編集を務めるGPU Zen 2の執筆者募集が始まっています.出版はGDC 2019の時期を目指すようですね.

http://gpuzen.blogspot.jp/2018/01/gpu-zen-2-call-for-authors.html

今回はサンプルコードを実装するサンプルのためのフレームワークとしてThe Forgeというのが公開されています.

https://github.com/ConfettiFX/The-Forge

このThe Forgeは,DX12/Vulkan/Metal 2(PS4も対応予定)に対応し,サンプルにはVisibility Bufferがあります.Visibility Bufferの実装例を見てみるにはいいかもしれませんね.

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

NXT:新しいWeb向けグラフィックスAPI

GoogleのGitHubのリポジトリにNXTという新しいWeb向けグラフィックスAPIのリポジトリが公開されていました.

https://github.com/google/nxt-standalone

Googleのオフィシャルというよりは実験的なプロジェクトのようでANGLEから新しく設計したプロトタイプのようですね.

Chromium向けで,D3D12, Metal, Vulkanの世代のような考え方(…に加えてOSごとにバックエンドになる)を取り入れたりSPIR-Vを導入したりという部分はANGLEから変わる部分かと思います.

WebKitから新しいブラウザ向け3DグラフィックスAPI WebGPUが発表

WebKitから新しいブラウザ向け3D グラフィックスAPIのWebGPUが発表になっています.

Next-generation 3D Graphics on the Web
https://webkit.org/blog/7380/next-generation-3d-graphics-on-the-web/

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

WebGLが,OpenGL ESをベースにしていますが,WebGPUはD3D12,Metal,Vulkanの世代のAPIの設計に近いローレベルAPIになるようですね.

現時点では,AppleがWebKitを主導する分Metalに近い印象ですね.シェーダに関してもMetal Shading Languageのようですが,DXILやSPIR-Vへの対応自体は否定してないようです.

Appleの環境,OS XやiOSなどではMetalベースのアプリケーションが多くあるので,そうしたものをSafariに持って来る上では,WebGLでは都合が悪くなってきているのかもしれませんね.