BRDF 系のブックマーク

Optimizing PBR
https://community.arm.com/cfs-file/__key/communityserver-blogs-components-weblogfiles/00-00-00-20-66/siggraph2015_2D00_mmg_2D00_renaldas_2D00_slides.pdf

Microfacet Based Bidirectional Reflectance Distribution Function
http://jbit.net/~sparky/academic/mm_brdf.pdf

Directional Statistics BRDF Model
https://vision.ist.i.kyoto-u.ac.jp/research/dsbrdf/

Understanding the Masking-Shadowing Function in Microfacet-Based BRDFs
http://jcgt.org/published/0003/02/03/paper.pdf

Physically Based Shading in Call of Duty: Black Ops
https://blog.selfshadow.com/publications/s2013-shading-course/lazarov/s2013_pbs_black_ops_2_notes.pdf

Spherical Gaussian approximation for Blinn-Phong, Phong and Fresnel
https://seblagarde.wordpress.com/2012/06/03/spherical-gaussien-approximation-for-blinn-phong-phong-and-fresnel/

“Call of Duty: Black Ops 2 のより物理ベースなシェーディング(SIGGRAPH 2013)”の説明
https://hanecci.hatenadiary.org/entry/20130812/p1

Paper

Understanding the Masking-Shadowing Function in Microfacet-Based BRDFs

KhronosGroup の glTF

glTF-Sample-Viewer
https://github.com/KhronosGroup/glTF-Sample-Viewer

glTF-Compressonator
https://github.com/KhronosGroup/glTF-Compressonator

参考

https://github.com/KhronosGroup/glTF-Compressonator/tree/master/Compressonator/Applications/_Plugins/C3DModel_viewers/glTF_DX12_EX

https://github.com/KhronosGroup/glTF-Compressonator/tree/master/Compressonator/Applications/_Plugins/C3DModel_viewers/glTF_DX12_EX/DX12Util

https://github.com/KhronosGroup/glTF-Compressonator/tree/master/Compressonator/Applications/_Plugins/C3DModel_viewers/glTF_DX12_EX/DX12Util/shaders

法線マップ周りの覚書

Blending in Detail
https://blog.selfshadow.com/publications/blending-in-detail/
法線マップに、詳細法線マップを足すときの方法

Real-Time Normal Map DXT Compression
https://www.researchgate.net/publication/259000109_Real-Time_Normal_Map_DXT_Compression
法線マップの圧縮方法

Tangent Space Normal Mapping
https://docs.cryengine.com/display/SDKDOC4/Lighting
cryengine の記事

NormalMapCompression
https://github.com/castano/nvidia-texture-tools/wiki/NormalMapCompression

BC5で圧縮された 2ch (x, y) から z を計算する。

z = sqrt(1 - saturate(x*x + y*y))

法線は単位ベクトルなので、長さが 1 になる。
1 = sqrt( x*x + y*y + z*z) を満たす値になるため。

とても参考になりました。

DirectX の座標変換

World matrix

ローカル座標から、ワールド座標へ。

View matrix

ワールド座標から、カメラ(からの相対)座標へ

D3DXMatrixLookAtLH function
https://docs.microsoft.com/en-us/windows/win32/direct3d9/d3dxmatrixlookatlh

zaxis = normal(At - Eye)
xaxis = normal(cross(Up, zaxis))
yaxis = cross(zaxis, xaxis)
    
 xaxis.x           yaxis.x           zaxis.x          0
 xaxis.y           yaxis.y           zaxis.y          0
 xaxis.z           yaxis.z           zaxis.z          0
-dot(xaxis, eye)  -dot(yaxis, eye)  -dot(zaxis, eye)  1

カメラ位置へのワールド行列を求め、その逆行列が View matrix。カメラからの相対座標。

Projection matrix

カメラ位置から、ビューカード内の位置へ。

VS からラスタライザへ

vs で、world -> view -> projection で計算した頂点は下記ような値になり、SV_POSITION として頂点アウトプットしてラスタライザに渡される。

(-1.81066     2.41421342  3.99039908  4.0)
(1.81066    -2.41421342  3.99039908  4.0)
(-1.81066    -2.41421342  3.99039908  4.0)

ラスタライザでは、w と比較してクリッピングを行い、ビューボリューム内に頂点が含まれていることを確認。その後に、Viewport scaling matrix を適用して、描画するレンダーターゲットの位置に変換される。

(700.5888     380.5887792    3.99039908   4.0)
(1859.4112     1539.4112208     3.99039908    4.0)
(700.5888     1539.4112208     3.99039908    4.0)

同次座標のため、w で除算した結果がスクリーン上の座標になる。

(175.1472      95.1471948    0.99759977   1.0)
(464.8528     384.8528052    0.99759977   1.0)
(175.1472     384.8528052    0.99759977   1.0)

https://docs.microsoft.com/en-us/windows/win32/direct3d9/viewports-and-clipping

PS の SV_POSITION に来る値

PS Stage の float4 pos : SV_POSITION で取得できる値は、下記になる。
(175.50, 96.50, 0.9976, 4.0)

XY はスクリーン上の位置、Z は深度バッファに書き込まれる値、W は W

ゲームグラフィックスでの人の作り方

フォトリアルなキャラクター
https://docs.unrealengine.com/ja/Resources/Showcases/PhotorealisticCharacter/index.html

Kiteの少年と学ぶUE4.11の新シェーダ
https://www.youtube.com/watch?v=hZPGEwpg6qw&feature=share
https://www.slideshare.net/SatoshiKodaira/kiteue411

もふもふレンダリング入門(1)
https://qiita.com/Ushio/items/b815fcf1cd491ba1079f

Hair Rendering and Shading
http://developer.amd.com/wordpress/media/2012/10/Scheuermann_HairRendering.pdf

ライティング周りの参考資料

CEDEC 2014 レンダリング技術解説
https://www.siliconstudio.co.jp/rd/presentations/files/CEDEC2014/CEDEC2014_sskk.pdf

CEDEC 2015 物理ベース時代のライトマップベイク奮闘記
https://www.siliconstudio.co.jp/rd/presentations/files/CEDEC2015/cedec2015_lightmap.pdf

講演資料 シリコンスタジオ
https://www.siliconstudio.co.jp/rd/presentations/

Moving Frostbite to PBR
https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf

Real Shading in Unreal Engine 4
https://blog.selfshadow.com/publications/s2013-shading-course/karis/s2013_pbs_epic_notes_v2.pdf

Physically Based Rendering in Filament
https://google.github.io/filament/Filament.html

ライティング周りのブックマーク
https://blog.acheul.net/?p=2389

ライティング周りのブックマーク

GLSL Programming/Unity/Diffuse Reflection of Skylight
https://en.wikibooks.org/wiki/GLSL_Programming/Unity/Diffuse_Reflection_of_Skylight

GLSL Programming/Unity/Diffuse Reflection
https://en.wikibooks.org/wiki/GLSL_Programming/Unity/Diffuse_Reflection

PBR Theory
https://learnopengl.com/PBR/Theory

Lighitng
https://learnopengl.com/PBR/Lighting

IBL Diffuse irradiance
https://learnopengl.com/PBR/IBL/Diffuse-irradiance

Specular IBL
https://learnopengl.com/PBR/IBL/Specular-IBL

貴重な資料に感謝。

Google Filament のシェーディング

main.fx の main() がエントリーポイント
shading_lit.fs の evaluateMaterial() が呼ばれ、その中の evaluateLights() がライティング用の関数。shading_lit.fs の中に evaluateLights() があり、evaluateIBL() -> evaluateDirectionalLight() -> evaluatePunctualLights() の順番で呼ばれている。

evaluateIBL, evaluateDirectionalLight, evaluatePunctualLights のそれぞれで、surfaceShading() が呼ばれている。standard, cloth, subsurface が surfaceShading() を実装している。マテリアルによって切り替えている。