フォト

Google AdSense


  • AdSense
無料ブログはココログ

2018.06.16

α7III持ってようやく

最近l購入したα7III持ってようやくがっつり写真を撮りに。

レンズはまだあんまりSonyのがないのでマウントアダプターでAF-S NIKKOR 24-120mm f/4G ED VRとか
AF-S NIKKOR 58mm f/1.4G(後半の紫陽花だけ)あたりのニコンレンズで。

品切れが多いけど、SEL24105Gあたりがほしい。

Chiba Zoological Park 千葉市動物公園

2018.06.10

α7III購入

長いことフルサイズはNikon Dfを使っていたのですが、そろそろ買い替えの周期かなと言うことでα7IIIを購入。

ちょっと4K HDR撮れるカメラ欲しかったのですよね。

ただ、レンズに関してはNikonで揃えたものを活かしたいとは思ってまして、AF対応のマウントアダプタを購入でAF-S NIKKOR 58mm f/1.4Gをつけてみました。カメラ側が対応機種じゃなかったので心配でしたが大丈夫でした。

2018.04.03

DirectX Raytracing (DXR) の話 その1 APIの構造など

最近、DXRを触り始めていますが、少しずつメモとして中身について書いていこうと思います。

今回は、APIの構造などについてですね。

DXRのサンプルなどはGitHubにあるのですが、ドキュメントに関しては、DXRSDK_v0.09.01.zipをダウンロードするとその中に入ってます。

Getting Started with Raytracing
http://forums.directxtech.com/index.php?topic=5860.0

それからGDC 2018のスライドも良いと思います。

https://msdnshared.blob.core.windows.net/media/2018/03/GDC_DXR_deck.pdf

NVIDIAのIntroduction to NVIDIA RTX and DirectX Raytracingも導入にはわかりやすいと思います。

https://devblogs.nvidia.com/introduction-nvidia-rtx-directx-raytracing/

この記事では、DXRSDK_v0.09.01.zipに付属する4.5 Ray-geometry interaction diagramにある図を取り上げます。

Dxr

DXRはDirect3D12の上で動いてますので、Command Queue、Command Lists、Descriptor Heapなどについては考え方は同じです。あと、頂点バッファ、インデックスバッファも使いまわしが効きます。

レイを飛ばすのはCommand ListsのDispatchRays()をします。これによりレイトレーシングのためのシェーダが実行されますが、今回はこの話は置いておきます。あと、構造的に近い部分のあるOptiXの話もしません。

今回は、2つの話題Acceleration structureとshader tableの話題をします。

Acceleration structureの話

図の話に戻りますが、DXRではまずはAcceleration structureというものがあります。Accelerationは2つに分かれています。図でいうと上半分ですね。

・top level acceleration structure
・bottom level acceleration structure

top level acceleration structureは、instanceというものを持ちますが、これにはレイを飛ばしたあとのシェーダやbottom level acceleration structureや各種マトリックスなどが入っています。

bottom level acceleration structureはレイをうけるジオメトリを登録しておきます。ジオメトリには三角形メッシュやAABBなどの形状を選択することができます。bottom level acceleration structureには複数のジオメトリを登録しておくことができますので、あらかじめ頂点やインデックスバッファを連結などしておく必要はありません。

bottom level acceleration structureは、ゲームなどで言えばキャラクターや背景などのジオメトリなどが格納されるわけですね。

一方。top level acceleration structureはレイを飛ばす側の例えば、カメラからレンダリングしたいとかShadow Rayを飛ばしたいとかでは、instanceを複数作るわけですね。

なお、DXRのAPIではAcceleration structureはID3D12Resourceのようです。

Shader tableとshader recordの話

つづいて図の下半分の話をしますが、下半分はシェーダの話です。

DXRでは、実行したいシェーダやパラメータのセットをテーブルに登録します。これがshader tableですね。shader tableの1つ1つはshader recordと呼ばれます。

top level acceleration structureのinstanceでもつShaderIndexはテーブル内のインデックスということになります。

なお、shadertable内のindexの指定方法ですが、instance 1つにつき1 shader recordを実行する他に、開始インデックスを決めてそこから連続した shader recordを複数連続で実行する指定方法があります。

shader recordは、shader identifierを言うのを持ちますが、これは図ではhit groupという構造になります。

DXRでは、頂点シェーダからピクセルシェーダのようなGPUのパイプラインと違いhit groupに呼び出すシェーダを登録しておきます。

hit groupにはレイを飛ばした時にヒットしたときに実行されるシェーダやヒットしなかったときのシェーダなどのレイを飛ばしたあとに呼び出されるシェーダのセットを持ったものになります。

shader recordは、shader identifier以外にRoot ConstantやDescriptor Tableなどシェーダのリソースバインディングにかかわる情報を持ちます。Descriptor HeapはDirect3D12に引き続き使用されます。

DispatchRaysの単位でのリソースバインディングについてはshader recordが重要になるわけですね。

今回のまとめ

DXRのプログラムに入る前に、まずはこの構造を頭に入れてC++のコードを読むと良いんではないかと思います。あと、Direct3D12自体のAPIの知識は必須です。

次回はDXRのシェーダ部分について書きます。

2018.03.24

越中島の桜 2018

結構咲いてきたので、RX1Rでの撮影です。

越中島の桜 2018

2018.03.21

DirectX Raytracingサンプル実行

DirectX Raytracingサンプルを実行してみました。

Getting Started with Raytracing
http://forums.directxtech.com/index.php?topic=5860.0

サンプルには、シンプルな三角形を描画するものとMiniEngineのサンプルをベースにSponzaを描画するものがありました。Sponzaでは、Releaseビルドで、実行しているGPUはGeForce GTX 1080ですが、21ms 41Hzと表示があるとおり30 fpsは出てますが、60は出てません。


Dyyjgdavmaahvok

Miniray001

すでにPixが対応しているので入れてみました。

PIX 1803.16-raytracing – DirectX Raytracing support
https://blogs.msdn.microsoft.com/pix/2018/03/19/pix-1803-16-raytracing-directx-raytracing-support/

下記画像のようにキャプチャが無事にできました...と思ったんですが、APIイベントリストを見てるとDirect3D12のコマンドのままなので何がおかしいですね....と思ったら準備が1つ足らなかったようです。

Pix001

Pix002

足らない準備に関しては、Getting Started読みましょう。

https://blogs.msdn.microsoft.com/pix/directx-raytracing/

Manually copy the DirectX Raytracing binaries (d3d12.dll, d3d12SDKLayers.dll and DXGIDebug.dll) into your PIX installation directory
◦ PIX is typically installed here: C:\Program Files\Microsoft PIX\[build number]

なるほどDLL手動コピーでしたか。気を取り直して、再キャプチャ...してみたんですが、DirectX Raytracingのイベントに切り替わらないですね、ちょっと調査ですね。

2018.03.06

HDRの画像ビューワーを大幅に更新しました

Screenshot_2

Heatmap

3/30のGCC'18で話題にするHDR画像ビューワーを大幅に更新しました。

https://github.com/shaderjp/HDROpenEXRViewer

今回の対応で、以下の点を更新しました。

・JPEG XR対応
・ヒートマップ対応
・多くのバグの修正

まずは、JPEG XRですが、これはXbox OneやWindows 10 RS4のHDRキャプチャのために対応しました。DirectXTexでは対応簡単でした。Windows 10 RS4の正式版が来た頃にロードの話はやります。

ヒートマップ対応ですが、下記の記事にインスパイアされた分析機能です。ヒートマップのテーブルのテクスチャが見ずらい人は下記のサイトの輝度のバーを見ながらどの色が何nits表してるか判断してください。

HDR games analysed
https://www.resetera.com/threads/hdr-games-analysed.23587/

JPEG XR対応をやったのでMicrosoft系の環境でHDRキャプチャした素材を見るビューワーとして使える感じです。

この話題に関しては下記で軽く解説しています。

Xbox OneのHDRスクリーンキャプチャ機能を使ったHDRタイトルの分析
http://masafumi.cocolog-nifty.com/masafumis_diary/2018/02/xbox-onehdrhdr-.html

ソースをビルドしたくない方は、Releaseビルドのバイナリを下記においてます。heatmap.ddsだけは使用するので、セットでおいておいてください。

https://github.com/shaderjp/HDROpenEXRViewer/tree/master/bin

それから既知の不具合ですが、ファイルロードのダイアログで読み込むファイルタイプのフィルタを変えるとフィルタが反映されないことがある。フィルタが反映されないときはダイアログのフォルダ階層を移動してみてください。

下記の画像だと赤丸で囲った場所を変えても即時に反映されず、別なフォルダに移動とかすると反映されます。これは後程調査します。

Ss

2018.03.04

Windows 10 RS4のHDR対応

Windows Insiderで自宅のPCを1台Windows 10 RS4のPreviewにしました。

RS4ではHDRの設定が、「HDRとWCGの設定」(WCGはWide Color Gamut)にかわってますね。

Rs001

RS4のPreviewの記事を見ているとSDRのコンテンツの輝度を設定できるようになったようで、これでデスクトップをHDRの状態に常時しておける印象ですね。

Rs002

ちなみに、RS4の段階でもPrintScreenではHDRではスクリーンショットを取れませんが、「Winキー + G」のXbox由来のキャプチャ機能だとHDRのアプリを*.jxr(JPEG XR)でスクリーンショットを撮ってくれるようになりました(動画に関してはのちほど)。


試しに撮ってみたのが下記です。

「d3d12hdrviewer_2018_03_04_18_09_38.jxr」をダウンロード

2018.02.14

Unity 2018.1b6のライトで気になる新要素

Unity 2018.1b6のライトで気になる新要素(b5でもあったのですが、これを書いてる時点ではb6)があったのでメモです。今後、仕様などは変わるかもしれません。

Unity 2018.1のベータではスクリプタブルレンダーパイプラインが導入されるようで、デフォルトでその仕組みを利用して、3つのプリセットのプレビューが入っています。3つのプリセットに関して下記の記事が詳しいです。

Unity 2018 とグラフィックス
https://blogs.unity3d.com/jp/2018/01/18/2018-and-graphics/

今回は、高画質レンダーパイプライン(HDRP)のライトについての話題になります。

HDRPを起動すると下記ようなシーンが入っています。従来の描画の流れと違うことについては上の記事などにあるので、ライトを見てみます。

Hdrp001

HDRPでは、ライト周りもどうも変わってるようでIntensityのデフォルト値なんかも3.14159に変わってますね。これはライトの単位も物理的にしようという感じがしますね。

Hdrp002

で、今回の話ですが、よく見るとLightのShapeの個所にRectangleのいうのがありますね(下図の赤丸)。従来のライトではBake専用でAreaライトがありましたが、これはリアルタイムも行けるようで青丸で囲ったModeの個所でRealtimeとBakeが選択できます。ちなみに、ほかにLineライトなんかもあります。

Hdrp003_2

そういえば、SIGGRAPH 2016でUnityが下記のような論文を出していましたが、この辺の成果が無事に入ったということなんでしょうかね。

Real-Time Polygonal-Light Shading with Linearly Transformed Cosines
https://labs.unity.com/article/real-time-polygonal-light-shading-linearly-transformed-cosines

ゲームエンジンでリアルタイムのエリアライトが使えるようになるというのは正式リリースが楽しみな話が1つ増えましたね。

2018.01.28

Visibility BufferとCluster CullingとTriangle filteringを振り返る2018頭

GPU Zen 2の執筆者募集のタイミングで公開されたThe Forgeですが、最初に公開されたときよりVisibility Buffer(Examples_3)のサンプルが更新されたので動かしてみました。

vb

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

最初のビルドではAssimpまわりのライブラリの設定があったんですが、それはしなくてよくなりましたね(アセットはGitHubにはないのでWindowsならPRE_BUILD.batで取ります)。自分の環境(Win 10 + GeForce GTX 1080)ではDX12/Vulkan両方動きました。

今回の実装に関しては、GitHubのサンプルのDocumentに資料があります。

https://github.com/ConfettiFX/The-Forge/tree/master/Examples_3/Visibility_Buffer/Documentation

この実装は、もともとはWolfgang Engel氏がGDC Europe 2016で紹介した下記のリンクの話でしたが、上記の発表よりも手法のフォローが増えているように見えますので、今読むなあら上がいいんでしょうね。


https://www.gdcvault.com/play/1023792/4K-Rendering-Breakthrough-The-Filtered

この実装は、Visibility Bufferに目が行きますが、Cluster CullingとTriangle filteringなども実装されたものになっています。

・Visibility Buffer
Visibility Buffer自体は、2013年に提案されたものでしたね。

http://jcgt.org/published/0002/02/04/

すぐ、使おうという人が多くなかったのは、おそらく今と違ってまだ4Kへの対応の必要性が少なかったからかと思います。

G-bufferの帯域の問題というのは、1080pの時に比較してゲームの4K対応なって問題としてあげられることが増えてきました。

あとは、まだ実装例を見れていないですがメモリが遅いモバイルなどで通常のDeferred Renderingとどちらが良いかという議論はありそうですね。Metal 2やVulkanの世代では実装例が出るか気になるところですね(既存のゲームエンジンを使用せずにフルスクラッチでレンダリングのコードを書くようなタイトルがあれば...ですが)。

・Cluster CullingとTriangle filtering

Cluster CullingやTriangle filteringに関してSIGGRAPH 2015: Advances in Real-Time Rendering in GamesのGPU-Driven Rendering Pipelinesかと思います。

http://advances.realtimerendering.com/s2015/aaltonenhaar_siggraph2015_combined_final_footer_220dpi.pdf

これは、Assassin’s Creed Unityの大規模なパリの街の描画に使われた手法で、メッシュを64頂点のストリップを1 Clusterとして画面内での可視判定(こっちがCluster Culling)を行って、描画に積むメッシュのClusterを決定する(描画に使う三角形を抽出するのがTriangle filteringでしょう)というものですね。

こうした技術が使えるようになったのはOpenGL/DX12/VulkanなどのMulti DrawやExecute Indirectのような描画命令の発達が背景にあるわけですね。特にDeferred RenderingのG-buffer描き込みなどはシェーダのバリエーションがあまりないので相性がいいわけですね。

Cluster Cullingは、AMDはサンプルを公開していますし、Wolfgang Engel氏の発表などになるわけですね。

GeometryFX 1.2 – Cluster Culling
https://gpuopen.com/geometryfx-1-2-cluster-culling/

Cluster CullingとTriangle filteringに関しては、Visibility Bufferでない環境でも有効ですので、こちらだけ採用してみたいというのもありなんでしょうね。

なお、これらを一歩進めよう(マテリアル周りのことも考慮しつつ)としているのが、Eidos MontrealのDawn EngineのDeferred Plusでしょうね。これに関しては下記に記事がありますが、GPU Zenの1に記事がありますのでそちらを見るとよいかと思います。

DEFERRED+: NEXT-GEN CULLING AND RENDERING FOR DAWN ENGINE
https://eidosmontreal.com/en/news/deferred-next-gen-culling-and-rendering-for-dawn-engine

・まとめ

従来型のDeferred Renderingの問題である帯域の問題やマルチレイヤーマテリアルへの柔軟な対応(G-bufferにDiffuse AlbedoやMetalic, Roughnessなどのパラメータを1種類しか格納できない)などの改善に関しては、DX12/Vulkan/Metalの世代にあった描画パイプラインの提案は今年あたりから様々提案がされてきそうですね。

その出発として、このサンプルやこの記事で紹介している技術を学ぶのは良いんじゃないかと思います。

2018.01.12

HDR10ディスプレイ向けOpenEXRビューワーの仮公開

ソースコードの整理などやらないといけないことはあるのですが、一旦、公開します。

https://github.com/shaderjp/HDROpenEXRViewer
※Windows 10はPrintScreenするとsRGBにされるので、色域落ちてます。
※公開時点でGitHubが落ちたみたいなので復旧したら見てください。

一応、binフォルダにビルド済みの実行ファイルはありますので、とりあえず、プログラマじゃなくて使いたい方はそっちを起動してください。

サンプル画像は3つつけてますが、それは下記を見てください。

http://masafumi.cocolog-nifty.com/masafumis_diary/2018/01/hdr10openexrhdr.html

このツールを題材にした話については、とあるイベントで話をする予定です。その時までにバージョン1.0にしたいところですね。

口頭発表をするようなイベント会場はおそらくHDRプロジェクタやテレビがあるような環境ではないと思いますので、サンプルを公開するから自分の環境で見てください...という感じでの公開です。

あと、Visual Studio 2017入れてないWin 10+Fall Creators Updateの方の環境で実行ファイルが起動しないなどあれば。

Screenshot

より以前の記事一覧