tinyrenderers : シングルヘッダでDirect3D12, Vulkan対応の簡易レンダラ

GitHubでシングルヘッダでDirect3D12, Vulkan対応の簡易レンダラのが公開されています.

https://github.com/chaoticbob/tinyrenderers

機能は高機能ではないですが,導入が楽なのと2つのAPIで同じ機能を実装する学習用などに良いかもしれないですね.


Laugh Engine : Vulkanで実装されたPBRレンダラ

GitHubでVulkanで実装されたPBRレンダラのプロジェクトがありました.

https://github.com/jian-ru/laugh_engine

Windows + Visual Studio環境だとすぐにビルドして試すことができます.


Xbox-ATG-Samplesの更新 ~ DisneyスタイルのPBRシェーダのサンプルなど

MicrosoftがGitHubで公開している”Xbox-ATG-Samples”の2016年12月の更新がされています.

https://github.com/Microsoft/Xbox-ATG-Samples

このサンプルは,Windows 10(UWP)とXbox One向けのベーシックなサンプル(Direct3D12以外にもオーディオやゲームパッドなど)が集まったものになっています(よりつっこんだDirect3D12のサンプルはDirectX-Graphics-Samples).

このサンプルについては結構前からあったのですが,基本的なサンプルすぎてあまり追っていなかったのですが,10月にDisneyスタイルのPBRシェーダのサンプルが加わっています.

SimplePBR12
https://github.com/Microsoft/Xbox-ATG-Samples/tree/master/Samples/Graphics/SimplePBR12


サンプルの実行結果

シェーダの中でRMAと呼ばれるテクスチャがありますが,これはRoughness, Metalic, Ambient Oculusion Mapが1つにマージされたものです.

ビルドや実行はWindows 10である必要がありますが,シェーダ自体はそれほど複雑ではないのでDisneyスタイルのPBRのシェーダを使用したい人などはとっかかりとしてよいと思います.


OpenGLでReversed-Zに切り替える行うチュートリアル記事

最近,UnityがDepth Bufferの方針をReversed-Zに変えたことで話題になりましたが,OpenGLでReversed-Zに切り替える行うチュートリアル記事を公開している人がいました.

Reversed-Z in OpenGL
https://nlguillemot.wordpress.com/2016/12/07/reversed-z-in-opengl/

Reversed-Zに関しては,ゲームコンソールにGPUが搭載されたぐらいのころからいろいろと議論があったとは思いますが,かなり前なのでなかなかまとまった資料が現在見つけにくくなってる(古くて消えてる)ところがありますが,NVIDIAのDepth Precision Visualizedは振り返るのによいと思います.

Depth Precision Visualized
https://developer.nvidia.com/content/depth-precision-visualized


SIGGRAPH ASIA 2016のKhronos groupの発表スライドが公開に

Khronos groupのSIGGRAPH Asia 2016の発表スライドが公開になっています.

https://www.khronos.org/developers/library/2016-siggraph-asia

今回はAPIやワークグループごとにBoFがある形ではなく,全部まとまった資料になっています.

トピックとして,以下のようなものを扱っています.

  • OpenCL 2.2
    • SYCL
  • OpenCV
  • SPIR-V
  • Vulkan
  • OpenVX
    • Neural Net Extension
    • NNEF
      • Neural Network Exchange Format…ニューラルネットワーク交換フォーマット
  • WebGL
  • glTF
    • 将来の機能の話などがあります
  • VRの標準化

NVIDIAのVulkan Device-Generated Commands拡張のサンプルと記事

以前,NVIDIAのVulkan Device-Generated Commands拡張について記事を書きました(以前の記事)が,サンプルと解説記事が公開されています.

Driver and New Sample for VK_NVX_device_generated_commands
https://developer.nvidia.com/driver-and-new-sample-vknvxdevicegeneratedcommands

ソース
https://github.com/NVIDIAGameWorks/GraphicsSamples/tree/master/samples/vk10-kepler/BasicDeviceGeneratedCommandsVk

ドキュメント
http://nvidiagameworks.github.io/GraphicsSamples/DeviceGeneratedCommandsVulkanSample.htm

 


Unity TechnologiesがHLSLのバイトコードをGLSLやMetal Shading Languageに変換するHLSLccをオープンソース化

Unity TechnologiesがHLSLのバイトコードをGLSLやMetal Shading Languageに変換するHLSLccをオープンソース化しました.

HLSLcc
https://github.com/Unity-Technologies/HLSLcc

Unityは古くは,ATIのHLSL2GLSLをフォークしたhlsl2glslforkを使っていたことがありましたが,DX9スタイルのシェーダしかコンバートができなかったのでいつからか別な環境に代わったのですがソースを公開しない形になっていました.今回新たにUnityのシェーダの変換の仕組みがオープンソース化されたようですね.

HLSLccはUnity内部で様々なグラフィックスAPI向けのシェーダの生成に使われているようです.HLSLccはHLSLのバイトコードからシェーダを生成するのですが,fxcのコンパイルオプション”-Fo”で出力できると思います.

FXC.exeの構文
https://msdn.microsoft.com/ja-jp/library/bb509709(v=vs.85).aspx

HLSLccはHLSLCrossCompilerをベースに機能の拡張やコードのメンテナンスを行ったようです.

HLSLCrossCompiler
https://github.com/James-Jones/HLSLCrossCompiler

機能の追加によって,GLSL(Vulkanへの対応はHLSLCrossCompilerでは対応していません)の対応だけでなくMetal Shading Languageなどの出力などに対応しています.

  • GLSL (OpenGL 3.2 and later)
  • GLSL ES (OpenGL ES 3.0 and later)
  • GLSL for Vulkan consumption (as input for Glslang to generate SPIR-V)
  • Metal Shading Language

CMakeをかけてビルドを行ってみましたが,VS 2015だとDLLとしてビルドされるよう設定されていました(ちなみに,私の環境ではビルドエラーがでまくりましたがすぐに直せる範囲でした).開始はHLSL.cppのTranslateHLSLFromFile関数(ファイルから読み込み)やTranslateHLSLFromMem関数(メモリ内のシェーダのバイトコードから生成)を呼び出せばよいようです.

https://github.com/Unity-Technologies/HLSLcc/blob/master/src/HLSLcc.cpp

DLLできた後は,hlslcc.hに定義があります.

https://github.com/Unity-Technologies/HLSLcc/blob/master/include/hlslcc.h

よりつっこんだ使い方などの解説はそのうちするかもしれません.


NVIDIAのVulkan Device-Generated Commands拡張

NVIDIAの開発者向けサイトでVulkan Device-Generated Commandsという拡張の話が公開されています.

Vulkan Device-Generated Commands
https://developer.nvidia.com/device-generated-commands-vulkan

Vulkanでは実はDirect3D12でいうExecuteIndirectのようなGPU上のバッファで複数の描画コマンドをまとめてDrawやDispatchするような仕組みが現状なく,OpenGL時代のMulti Draw Indirectに関してもまだ機能しない状態だったりします.

vkCmdDrawIndirect(DescriptionのIf the multi-draw indirect feature is not enabled, drawCount must be 0 or 1.drawCount引数は0か1じゃないと動かない)
https://www.khronos.org/registry/vulkan/specs/1.0/man/html/vkCmdDrawIndirect.html

そこでNVIDIAの方でVK_NVX_device_generated_commandsという拡張を用意したのが上記の記事の話です.

NVIDIAの記事では下記の画像を使って,DX11スタイルのDraw Indirect,Multi Draw Indirect,Execute Indirect, VK_NVX_device_generated_commandsを紹介しています.

nvx_dgc_evolution

DX11スタイルのDraw Indirectではセットされた頂点バッファのインスタンシング描画にかかわる部分をGPUで読み書きできるバッファを使用することでCPUの関与を減らしてインスタンシング描画をすることができました.たとえば,上記記事でもありますがGPUでCompute Shaderを使用してカリングを行って,Draw Indirectカリングしないオブジェクトをインスタンシング描画するようなケースですね.Draw Indirectでは事前にバインドしている頂点バッファやインデックスバッファは1つのためインスタンシングできる形状は1種類になります.

続いてMulti Draw Indirectですが,こちらはバインドしている頂点バッファのオフセットと描画する頂点数を複数指定することができ,1つの頂点バッファにデータをつなげておけば異なる形状のインスタンシング描画を一発で行うことができます.ただし,シェーダや頂点バッファのレイアウトなどは変更することができません.

Execute IndirectではMulti Draw Indirectに比べてもう少し柔軟でDraw Callごとに入力やリソースのバインド状況を変えることで変化を出しやすくなりましたが,シェーダなどを変えることができませんでした.

VK_NVX_device_generated_commandsではExecute Indirectに加えてPipelineStateをDrawやDispatchの単位で変更できるように機能が追加されシェーダを変更したりするような機能に対応しています.これによりOcclusion cullingを異なるシェーダで描画するオブジェクトまとめてやってDrawに積んだり,異なるシェーダが適用されるオブジェクトに対してZ-sortをGPUでやるなどといったことが可能になると書かれています.

記事ではその原理と使い方が解説がされています.今のところNVIDIAの専用の拡張ですが,ほかのGPUベンダーなども採用したりVulkan標準やDirect3D12などで採用されるとレンダリングエンジンの描画コマンドの積み方に関して大きな改善につながるかもしれないですね.

サンプルとなる実装コード
https://github.com/nvpro-samples/gl_vk_threaded_cadscene/blob/master/doc/vulkan_nvxdevicegenerated.md


Steam Dev Days 2016動画公開

Steamの開発者向けのイベントがSteam Dev Days 2016がアメリカで10/12、10/13にありましたが、その動画が公開になったみたいですね.

Steam Dev Days 2016
http://steamcommunity.com/devdays

今回はやはりVRに関する話題が多いですが,VRに限らないSteam向けの開発やリリースに関するのセッションなどもあります.

動画は下記から視聴できます.

Steamで視聴
http://store.steampowered.com/app/534600/

Youtubeで視聴
https://www.youtube.com/playlist?list=PLckFgM6dUP2ihiMeKHoyIdHvhRSyqwQsp


Physically Based Rendering: From Theory to Implementationの第3版のKindle版

Physically Based Rendering: From Theory to Implementationの第3版ってKindle版出ていました.

書籍のページ
http://www.pbrt.org/

サンプルソース
https://github.com/mmp/pbrt-v3/

紙の方は11月末のようですね.