└── README.md /README.md: -------------------------------------------------------------------------------- 1 | # Ceegyresuarus 2 | 3 | This is a personal deposit for computer graphics related resource, please let me know if there is anything wrong/inaccurate, thanks! 4 | 5 | --- 6 | 7 | ## I.Blogs and Websites 8 | 9 | * https://ishansharma.github.io/twitter-mentors/ 10 | 11 | * http://www.jcgt.org 12 | 13 | * http://www.interactive-graphics.de/ 14 | 15 | * http://realtimecollisiondetection.net/blog/ 16 | 17 | * http://www.realtimerendering.com/blog/ 18 | 19 | * https://gametechdev.github.io/projects 20 | 21 | * http://www.parashift.com/c++-faq-lite/ 22 | 23 | * https://nhigham.com/blog/ 24 | 25 | * https://stallman.org/ 26 | 27 | * https://blog.selfshadow.com/ 28 | 29 | * http://casual-effects.com/#blog 30 | 31 | * https://www.jendrikillner.com/post/ 32 | 33 | * https://pharr.org/matt/blog/ 34 | 35 | * http://erich.realtimerendering.com 36 | 37 | * http://www.eugenedeon.com/ 38 | 39 | * http://graphicrants.blogspot.com/ 40 | 41 | * https://tomforsyth1000.github.io/blog.wiki.html 42 | 43 | * http://www.shawnhargreaves.com/blogindex.html 44 | 45 | * https://www.iquilezles.org 46 | 47 | * https://herbsutter.com 48 | 49 | * http://reedbeta.com 50 | 51 | * https://bartwronski.com/ 52 | 53 | * http://fabiensanglard.net 54 | 55 | * http://madebyevan.com/ 56 | 57 | * https://mynameismjp.wordpress.com 58 | 59 | * http://eelpi.gotdns.org/blog.wiki.html 60 | 61 | * https://randomascii.wordpress.com/ 62 | 63 | * http://c0de517e.blogspot.com/ 64 | 65 | * https://blog.demofox.org/ 66 | 67 | * http://www.elbeno.com/blog/ 68 | 69 | * http://ericniebler.com/ 70 | 71 | * http://aras-p.info/ 72 | 73 | * https://zeuxcg.org/ 74 | 75 | * http://alextardif.com/index.html 76 | 77 | * https://agraphicsguy.wordpress.com/ 78 | 79 | * https://www.stevestreeting.com 80 | 81 | * https://prideout.net/blog/old/blog.html 82 | 83 | * https://prideout.net/ 84 | 85 | * https://www.sagejenson.com 86 | 87 | * http://www.gijskaerts.com/wordpress/ 88 | 89 | * http://taichi.graphics/ 90 | 91 | * http://www.ludicon.com/castano/blog 92 | 93 | * http://efficientshading.com 94 | 95 | * https://raytracey.blogspot.com/ 96 | 97 | * https://caseymuratori.com 98 | 99 | * http://donw.io 100 | 101 | * http://www.adriancourreges.com 102 | 103 | * http://jpgrenier.org/index.html 104 | 105 | * http://lousodrome.net/blog/light 106 | 107 | * https://www.alanzucconi.com/tutorials/ 108 | 109 | * http://humus.name/index.php?page=News 110 | 111 | * http://kesen.realtimerendering.com 112 | 113 | * https://blog.mousefingers.com 114 | 115 | * https://openproblems.realtimerendering.com 116 | 117 | * http://advances.realtimerendering.com/ 118 | 119 | * http://www.loirak.com/ 120 | 121 | * https://lxjk.github.io/#blog 122 | 123 | * http://www.gijskaerts.com/wordpress/ 124 | 125 | * http://turnoff.us/ 126 | 127 | * https://wickedengine.net 128 | 129 | --- 130 | 131 | ## II.Topics 132 | 133 | ### 1.Texture and Color 134 | 135 | * [DXT and BC Compressions](http://reedbeta.com/blog/understanding-bcn-texture-compression-formats/) 136 | 137 | * [D3D11 Texture Format and Feature Support](https://docs.microsoft.com/en-us/windows/desktop/direct3ddxgi/format-support-for-direct3d-11-0-feature-level-hardware) 138 | 139 | * [Color Grading with Look-up Textures](http://halisavakis.com/my-take-on-shaders-color-grading-with-look-up-textures-lut/) 140 | 141 | * [Unraveling the JPEG](https://parametric.press/issue-01/unraveling-the-jpeg/) 142 | 143 | * [A Beginner’s Guide to (CIE) Colorimetry](https://medium.com/hipster-color-science/a-beginners-guide-to-colorimetry-401f1830b65a) 144 | 145 | * [Useful Color Equations](http://www.brucelindbloom.com/index.html?Math.html) 146 | 147 | * [Sharper Mipmapping using Shader Based Supersampling](https://medium.com/@bgolus/sharper-mipmapping-using-shader-based-supersampling-ed7aadb47bec) 148 | 149 | * [Small float formats – R11G11B10F precision](https://bartwronski.com/2017/04/02/small-float-formats-r11g11b10f-precision/amp/?__twitter_impression=true) 150 | 151 | ### 2.Procedural Graphics 152 | 153 | * [Signed Distance Functions](https://www.iquilezles.org/www/articles/distfunctions/distfunctions.htm) 154 | 155 | * [Sphere Marching Overstepping Issue](https://digitalfreepen.com/2017/06/21/consistent-distance-fields.html) and [Solutions](https://www.shadertoy.com/view/4dcBRN) 156 | 157 | * [Perlin Noise](http://flafla2.github.io/2014/08/09/perlinnoise.html) 158 | 159 | * [Simplex Noise](http://staffwww.itn.liu.se/~stegu/simplexnoise/simplexnoise.pdf) ([source code](http://weber.itn.liu.se/~stegu/simplexnoise/SimplexNoise.java)) 160 | 161 | * [Wang Tiling](https://blog.demofox.org/2014/08/13/wang-tiling/) 162 | 163 | * [The Unreasonable Effectiveness of Quasirandom Sequences](http://extremelearning.com.au/unreasonable-effectiveness-of-quasirandom-sequences/) 164 | 165 | ### 3.Hardware 166 | 167 | #### GPU 168 | 169 | * [DXGI Flip Model & BlkBlt Model](https://docs.microsoft.com/en-us/windows/desktop/direct3ddxgi/dxgi-flip-model) 170 | 171 | * [For best performance, use DXGI flip model](https://blogs.msdn.microsoft.com/directx/2018/04/09/dxgi-flip-model/) 172 | 173 | * [Sample Application for Direct3D 12 Flip Model Swap Chains](https://software.intel.com/en-us/articles/sample-application-for-direct3d-12-flip-model-swap-chains) 174 | 175 | * [D3D12 Fence and Present with Vsync](https://www.gamedev.net/forums/topic/700805-d3d12-fence-and-present/) 176 | 177 | * [VSync](https://computergraphics.stackexchange.com/a/2296) 178 | 179 | * [A Trip Through the Graphics Pipeline](https://fgiesen.wordpress.com/2011/07/06/a-trip-through-the-graphics-pipeline-2011-part-6/) 180 | 181 | * [Parsing Direct3D Shader Bytecode](http://timjones.io/blog/archive/2015/09/02/parsing-direct3d-shader-bytecode) 182 | 183 | * [D3D12 Shader Cache APIs](https://microsoft.github.io/DirectX-Specs/d3d/ShaderCache.html) 184 | 185 | * [Two Shader Compilers of Direct3D 12](https://asawicki.info/news_1719_two_shader_compilers_of_direct3d_12) 186 | 187 | * [Using the DirectXShaderCompiler C++ API](https://simoncoenen.com/blog/programming/graphics/DxcCompiling) 188 | 189 | * [Scalarization](https://flashypixels.wordpress.com/2018/11/10/intro-to-gpu-scalarization-part-1/) 190 | 191 | * [Occupancy Explained](https://gpuopen.com/learn/occupancy-explained/) 192 | 193 | #### Display 194 | 195 | * [Asynchronous Timewarp on Oculus Rift](https://developer.oculus.com/blog/asynchronous-timewarp-on-oculus-rift/) 196 | 197 | * [WDDM](https://docs.microsoft.com/en-us/windows-hardware/drivers/display/windows-vista-display-driver-model-design-guide) & [XDDM](https://docs.microsoft.com/en-us/windows-hardware/drivers/display/windows-2000-display-driver-model-design-guide) 198 | 199 | #### CPU 200 | 201 | * [Cache Coherency](https://fgiesen.wordpress.com/2014/07/07/cache-coherency/) 202 | 203 | #### Shader Compilers 204 | 205 | * [Two Shader Compilers of Direct3D 12](https://asawicki.info/news_1719_two_shader_compilers_of_direct3d_12) 206 | 207 | ### 4.Math & Physics 208 | 209 | * [Rotating a Single Vector Using a Quaternion](https://fgiesen.wordpress.com/2019/02/09/rotating-a-single-vector-using-a-quaternion/) 210 | 211 | * [A Collection of Math and Physics Applets](https://www.falstad.com/mathphysics.html) 212 | 213 | * [GJK Algorithm](https://caseymuratori.com/blog_0003) 214 | 215 | * [Separate Axis Theorem](https://gamedevelopment.tutsplus.com/tutorials/collision-detection-using-the-separating-axis-theorem--gamedev-169) 216 | 217 | * [The Jacobi and Gauss-Seidel Iterative Methods](https://www3.nd.edu/~zxu2/acms40390F12/Lec-7.3.pdf) 218 | 219 | * [The Gauss-Seidel and Jacobi Methods for Solving Linear Systems](https://erkaman.github.io/posts/jacobi_and_gauss_seidel.html) 220 | 221 | * [Bit Twiddling Hacks](http://graphics.stanford.edu/~seander/bithacks.html#IntegerAbs) 222 | 223 | * [An Introduction to Gradient Descent](https://www.alanzucconi.com/2017/04/10/gradient-descent/) 224 | 225 | * [An Alternative to Normal-Matrix](https://lxjk.github.io/2017/10/01/Stop-Using-Normal-Matrix.html) 226 | 227 | * [Quantizing Floats](https://zeuxcg.org/2010/12/14/quantizing-floats/) 228 | 229 | * [An Interactive Introduction to Fourier Transforms](http://www.jezzamon.com/fourier/index.html) 230 | 231 | * [Computing Tangent Space Basis Vectors for an Arbitrary Mesh (Lengyel’s Method)](http://www.terathon.com/code/tangent.html) 232 | 233 | * [Polar Decomposition and SVD](https://nhigham.com/2020/07/28/what-is-the-polar-decomposition/) 234 | 235 | * [Derivative of log(det(X))](https://statisticaloddsandends.wordpress.com/2018/05/24/derivative-of-log-det-x/) 236 | 237 | * [Matrix Calculus](https://www.matrixcalculus.org/) 238 | 239 | * [Mpm Course](https://www.math.ucla.edu/~cffjiang/research/mpmcourse/mpmcourse.pdf) 240 | 241 | ### 5.Rendering 242 | 243 | #### Raytracing 244 | 245 | * [Hyperion Publications](https://blog.yiningkarlli.com/2019/07/hyperion-papers.html) 246 | 247 | * [LBVH Construction on GPU](https://developer.nvidia.com/blog/thinking-parallel-part-iii-tree-construction-gpu/) 248 | 249 | #### Rasterizer 250 | 251 | * [Depth Precision Visualized](http://www.reedbeta.com/blog/depth-precision-visualized/) 252 | 253 | * [Homogeneous Division after Clip Space](https://stackoverflow.com/questions/41085117/why-does-gl-divide-gl-position-by-w-for-you-rather-than-letting-you-do-it-your) 254 | 255 | * [Reversed Z Buffer](https://developer.nvidia.com/content/depth-precision-visualized) 256 | 257 | * [Triangle Visibility Buffer](https://diaryofagraphicsprogrammer.blogspot.com/2018/03/triangle-visibility-buffer.html?m=1) 258 | 259 | * [Alpha Compositing](https://ciechanow.ski/alpha-compositing/) 260 | 261 | * [Early Z (A trip through the Graphics Pipeline 2011, part 7)](https://fgiesen.wordpress.com/2011/07/08/a-trip-through-the-graphics-pipeline-2011-part-7/) 262 | 263 | * [Optimizing Software Occlusion Culling – index](https://fgiesen.wordpress.com/2013/02/17/optimizing-sw-occlusion-culling-index/) 264 | 265 | #### Shadow Maps 266 | 267 | * [GDC 2008 Soft Shadow Mapping](http://developer.download.nvidia.com/presentations/2008/GDC/GDC08_SoftShadowMapping.pdf) 268 | 269 | * [Variance Shadow Maps](http://lousodrome.net/blog/light/2012/01/23/variance-shadow-maps/) 270 | 271 | * [Cascaded Shadow Maps (Parallel Split Shadow Maps)](https://developer.download.nvidia.com/SDK/10.5/opengl/src/cascaded_shadow_maps/doc/cascaded_shadow_maps.pdf) 272 | 273 | * [Sparse Shadow Tree](https://www.activision.com/cdn/research/SparseShadowTree.pdf) 274 | 275 | * [Hardware Depth Bias](https://docs.microsoft.com/en-us/windows/desktop/direct3d11/d3d10-graphics-programming-guide-output-merger-stage-depth-bias) 276 | 277 | * [Opacity Shadow Maps and Deep Opacity Maps](https://volumetricshadows.wordpress.com/2011/07/23/deep-opacity-maps-in-crystal-space/) 278 | 279 | #### Anti-Aliasing 280 | 281 | * [MSAA Overview](https://mynameismjp.wordpress.com/2012/10/24/msaa-overview/) 282 | 283 | * [Anti-aliased Alpha Test: The Esoteric Alpha To Coverage](https://medium.com/@bgolus/anti-aliased-alpha-test-the-esoteric-alpha-to-coverage-8b177335ae4f) 284 | 285 | * [Subpixel Morphological Anti-Aliasing](http://www.iryoku.com/smaa/) 286 | 287 | * [FXAA](https://developer.download.nvidia.com/assets/gamedev/files/sdk/11/FXAA_WhitePaper.pdf) 288 | 289 | * [Deferred MSAA](https://docs.nvidia.com/gameworks/content/gameworkslibrary/graphicssamples/d3d_samples/antialiaseddeferredrendering.htm) 290 | 291 | * [Gradient Estimation for Real-Time Adaptive Temporal Filtering](https://cg.ivd.kit.edu/atf.php) 292 | 293 | #### Volumetric Rendering 294 | 295 | * [Real-Time Volumetric Rendering by Patapom](https://patapom.com/topics/Revision2013/Revision%202013%20-%20Real-time%20Volumetric%20Rendering%20Course%20Notes.pdf) 296 | 297 | * [Volumetric Lighting](https://developer.nvidia.com/VolumetricLighting) 298 | 299 | * [Physically Based Sky, Atmosphere & Cloud Rendering](https://www.ea.com/frostbite/news/physically-based-sky-atmosphere-and-cloud-rendering) 300 | 301 | * [Siggraph 2015 EA Volumetric Rendering](https://www.ea.com/frostbite/news/physically-based-unified-volumetric-rendering-in-frostbite) 302 | 303 | #### Water 304 | 305 | * [Hitman Ocean Technology](https://eidosmontreal.com/en/news/hitman-ocean-technology#!) 306 | 307 | * [Physically Simulated River](https://www.jpgrenier.org/riverrenderer.html) 308 | 309 | * [Approximating water reflection using terrain height maps](https://blog.uhawkvr.com/rendering/approximate-terrain-reflections/) 310 | 311 | #### Terrain 312 | 313 | * [The Transvoxel Algorithm](http://transvoxel.org/) 314 | 315 | * [CDLOD Terrain](https://github.com/fstrugar/CDLOD) 316 | 317 | * [Hex Tiling](https://jcgt.org/published/0011/03/05/) 318 | 319 | #### Visual Effects 320 | 321 | * [Interior Mapping](http://interiormapping.oogst3d.net/) 322 | 323 | * [Parallax Mapping](https://learnopengl.com/Advanced-Lighting/Parallax-Mapping) 324 | 325 | * [A Particle System Example](http://alextardif.com/Particles.html) 326 | 327 | * [Screen Space Deferred Decal](https://bartwronski.com/2015/03/12/fixing-screen-space-deferred-decals/) 328 | 329 | #### Materials & Lighting 330 | 331 | * [Energy Conserving Wrapped Diffuse](http://blog.stevemcauley.com/2011/12/03/energy-conserving-wrapped-diffuse/) 332 | 333 | * [Image Based Lighting with Multiple Scattering](https://bruop.github.io/ibl/) 334 | 335 | * [A Multiple-Scattering Microfacet Model for Real-Time Image Based Lighting](http://www.jcgt.org/published/0008/01/03/) 336 | 337 | * [Dynamic Diffuse Global Illumination](https://morgan3d.github.io/articles/2019-04-01-ddgi/index.html) 338 | 339 | * [Spherical Gaussians](https://mynameismjp.wordpress.com/2016/10/09/sg-series-part-1-a-brief-and-incomplete-history-of-baked-lighting-representations/) 340 | 341 | * [Deferred Subsurface Scattering using Compute Shaders](https://www.derschmale.com/2014/06/02/deferred-subsurface-scattering-using-compute-shaders/) 342 | 343 | * [Spherical Harmonics Light Probes](https://computergraphics.stackexchange.com/questions/4164/what-are-spherical-harmonics-light-probes) 344 | 345 | #### Mesh Processing 346 | 347 | * [Linear-Speed Vertex Cache Optimization](https://tomforsyth1000.github.io/papers/fast_vert_cache_opt.html) 348 | 349 | * [Marching Cubes and Dual Contouring](https://wordsandbuttons.online/interactive_explanation_of_marching_cubes_and_dual_contouring.html) 350 | 351 | #### Misc. 352 | 353 | * [The Problem of Alpha Cut Outs](http://www.shawnhargreaves.com/blog/texture-filtering-alpha-cutouts.html) 354 | 355 | * [Premultiplied Alpha by Shawn Hargreaves](http://www.shawnhargreaves.com/blog/premultiplied-alpha.html) 356 | 357 | * [Premultiplied Alpha and Image Composition by Shawn Hargreaves](http://www.shawnhargreaves.com/blog/premultiplied-alpha-and-image-composition.html) 358 | 359 | * [Premultiplied Alpha by Tom Forsyth](https://tomforsyth1000.github.io/blog.wiki.html#%5B%5BPremultiplied%20alpha%5D%5D) 360 | 361 | * [Premultiplied Alpha Part 2 by Tom Forsyth](https://tomforsyth1000.github.io/blog.wiki.html#%5B%5BPremultiplied%20alpha%20part%202%5D%5D) 362 | 363 | * [Tessellation Modes Quick Reference](http://reedbeta.com/blog/tess-quick-ref/) 364 | 365 | ### 6.Programming 366 | 367 | * [Memory Allocator](https://github.com/mtrebi/memory-allocators#build-instructions) 368 | 369 | * [Streaming SIMD Extensions](http://sci.tuomastonteri.fi/programming/sse) 370 | 371 | * [C++ Array Decay](https://www.geeksforgeeks.org/what-is-array-decay-in-c-how-can-it-be-prevented/) 372 | 373 | * [C++ Pure Virtual Destructor](https://eli.thegreenplace.net/2010/11/13/pure-virtual-destructors-in-c) 374 | 375 | * [Build a Heap in O(n) Time Complexity](https://stackoverflow.com/questions/9755721/how-can-building-a-heap-be-on-time-complexity) 376 | 377 | * [Difference between VERIFY and ASSERT](https://stackoverflow.com/questions/2642424/is-verify-a-good-practice-in-c-coding) 378 | 379 | * [Initialization in C++](https://mikelui.io/2019/01/03/seriously-bonkers.html) 380 | 381 | * [Writing Main Function in an Array](http://jroweboy.github.io/c/asm/2015/01/26/when-is-main-not-a-function.html) 382 | 383 | * [Floating Point Math](https://randomascii.wordpress.com/category/floating-point/) 384 | 385 | * [A Matter of Precision](http://tomforsyth1000.github.io/blog.wiki.html#%5B%5BA%20matter%20of%20precision%5D%5D) 386 | 387 | * [Different ways to read file in C/C++](http://insanecoding.blogspot.com/2011/11/how-to-read-in-file-in-c.html) 388 | 389 | * [Access to private members. That's easy!](http://bloglitb.blogspot.com/2010/07/access-to-private-members-thats-easy.html?m=1) & [Access to private members: Safer nastiness](http://bloglitb.blogspot.com/2011/12/access-to-private-members-safer.html?m=1) 390 | 391 | * [A Brief Introduction to Rvalue References](https://www.artima.com/cppsource/rvalue.html) 392 | 393 | * [Parallel Prefix Sum (Scan) with CUDA](https://developer.nvidia.com/gpugems/gpugems3/part-vi-gpu-computing/chapter-39-parallel-prefix-sum-scan-cuda) 394 | 395 | * [Static Initialization Order Fiasco](https://pabloariasal.github.io/2020/01/02/static-variable-initialization/#solving-the-static-initialization-order-fiasco) 396 | 397 | ### 7.Graphics APIs 398 | 399 | * [Vulkan Textures Unbound](http://roar11.com/2019/06/vulkan-textures-unbound/) 400 | 401 | * [Vulkan input attachments and sub passes](https://www.saschawillems.de/blog/2018/07/19/vulkan-input-attachments-and-sub-passes/) 402 | 403 | * [Introduction to Resource Binding in Microsoft DirectX 12](https://software.intel.com/en-us/articles/introduction-to-resource-binding-in-microsoft-directx-12) 404 | 405 | * [Mapping between Direct3D, OpenGL and Vulkan](https://computergraphics.stackexchange.com/questions/4422/directx-openglvulkan-concepts-mapping-chart) 406 | 407 | * [Discriptor Binding in DX12 and Vulkan](https://www.gamedev.net/forums/topic/678860-descriptor-binding-dx12-and-vulkan/) 408 | 409 | * [DX12 do's and don'ts](https://developer.nvidia.com/dx12-dos-and-donts) 410 | 411 | * [Vulkan do's and don'ts](https://devblogs.nvidia.com/vulkan-dos-donts/) 412 | 413 | * [DX12 root signature & Vulkan descriptor sets](https://gpuopen.com/performance-root-signature-descriptor-sets/) 414 | 415 | * [Difference between DX12 & Vulkan command queues](https://www.gamedev.net/forums/topic/700092-directx-12-command-queues/?do=findComment&comment=5396143) 416 | 417 | * [Common HRESULT Values](https://docs.microsoft.com/en-us/windows/desktop/seccrypto/common-hresult-values) 418 | 419 | * [Error codes that can be returned by a DXGI function](https://docs.microsoft.com/en-us/windows/desktop/direct3ddxgi/dxgi-error) 420 | 421 | * [Direct3D 11 Debug API Tricks](https://seanmiddleditch.com/direct3d-11-debug-api-tricks/) 422 | 423 | * [Performance of D3D12 and Vulkan](https://www.gamedev.net/forums/topic/701213-performance-of-d3d12-and-vulkan/?do=findComment&comment=5401226) 424 | 425 | * [Unified Resource State Management for Vulkan and Direct3D12](http://diligentgraphics.com/2018/12/09/resource-state-management/) 426 | 427 | * [Differences in memory management between Direct3D 12 and Vulkan](https://asawicki.info/articles/memory_management_vulkan_direct3d_12.php5) 428 | 429 | * [Debugging D3D12 driver crash](http://www.asawicki.info/news_1690_debugging_d3d12_driver_crash.html) 430 | 431 | * [DXGI Fullscreen Watchdog](https://docs.microsoft.com/en-us/windows/win32/direct3ddxgi/d3d10-graphics-programming-guide-dxgi#debugging-in-full-screen-mode) 432 | 433 | --- 434 | 435 | ## III.Projects 436 | 437 | * [Q2VKPT](http://brechpunkt.de/q2vkpt/?fbclid=IwAR2YPbzumyCID9uaikfpFSupAIYyveW_rL-uYswZ5b-X8GNP4FA_5KccTWo#main) 438 | 439 | * [Filament](https://google.github.io/filament/Filament.md.html) 440 | 441 | * [Xenia](https://github.com/xenia-project/xenia) 442 | 443 | * [Quartz](https://github.com/Nadrin/Quartz) 444 | 445 | * [Appleased](https://github.com/appleseedhq/appleseed) 446 | 447 | * [Godot](https://github.com/godotengine/godot) 448 | 449 | * [Basis Universal GPU Texture and Texture Video Compression Codec](https://github.com/binomialLLC/basis_universal) 450 | 451 | --- 452 | 453 | ## IV.Assets 454 | 455 | ### Books 456 | 457 | * http://www.realtimerendering.com/books.html 458 | 459 | * https://ebookfoundation.github.io/free-programming-books/free-programming-books.html 460 | 461 | * [Ray Tracing Gems](https://link.springer.com/book/10.1007/978-1-4842-4427-2) 462 | 463 | * [Physically Based Rendering: From Theory To Implementation Third Edition](http://www.pbr-book.org/) 464 | 465 | * [Linux Device Drivers Third Edition](https://lwn.net/Kernel/LDD3/) 466 | 467 | * [Ray Tracing in One Weekend](http://www.realtimerendering.com/raytracing/Ray%20Tracing%20in%20a%20Weekend.pdf) 468 | 469 | * [Ray Tracing: The Next Week](http://www.realtimerendering.com/raytracing/Ray%20Tracing_%20The%20Next%20Week.pdf) 470 | 471 | * [Ray Tracing: The Rest of Your Life](http://www.realtimerendering.com/raytracing/Ray%20Tracing_%20the%20Rest%20of%20Your%20Life.pdf) 472 | 473 | * [Game Engine Black Book DOOM](http://fabiensanglard.net/gebbdoom/) 474 | 475 | * [Game Engine Black Book: Wolfenstein 3D, 2nd Edition](http://fabiensanglard.net/gebbwolf3d/) 476 | 477 | * [Graphics Gems](http://www.realtimerendering.com/resources/GraphicsGems/) 478 | 479 | ### 3D Models 480 | 481 | * http://casual-effects.com/data/ 482 | 483 | * https://sketchfab.com/britishmuseum 484 | 485 | * http://virtualmathmuseum.org/index.html 486 | 487 | * http://www.cs.cmu.edu/~kmcrane/Projects/ModelRepository/index.html 488 | 489 | ### Textures 490 | 491 | * https://hdrihaven.com/hdris/ 492 | 493 | * https://vgl.ict.usc.edu/Data/HighResProbes/ 494 | 495 | ### Misc. 496 | 497 | * [DirectX-Specs](https://microsoft.github.io/DirectX-Specs/d3d/archive/D3D11_3_FunctionalSpec.htm#ShortTableOfContents) 498 | 499 | * [UIforETW](https://randomascii.wordpress.com/2015/09/24/etw-central/) 500 | 501 | * [Disney Cloud Dataset](https://www.technology.disneyanimation.com/clouds) 502 | 503 | --- 504 | 505 | ## V.Notes 506 | 507 | ### Rendering 508 | 509 | * [Wrapped diffuse model comes from Oren-Nayar model](https://developer.nvidia.com/gpugems/gpugems/part-iii-materials/chapter-16-real-time-approximations-subsurface-scattering) 510 | 511 | * [Parallel split shadow map is the academic name for cascaded shadow map.](https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch10.html) 512 | 513 | * [Caustic photon map in photon mapper is not necessary when you use global photon map to approximate caustics. It is introduced because caustics usually require more photons to be accurate. If accuracy is needed then emitting more photons and store the caustics in a separate map is a better approach. When doing this, global photon map should not store caustic photons anymore.](https://web.archive.org/web/20110607074737/http://www.cs.princeton.edu/courses/archive/fall02/cs526/papers/course43sig02.pdf) 514 | 515 | * [Scaling an object (using SDF) is slightly more tricky since that compresses/dilates spaces, so we have to take that into account on the resulting distance estimation. Still, it's not difficult to perform, although it only works with uniform scaling. Non uniform scaling is not possible (while still getting a correct SDF)](https://iquilezles.org/articles/distfunctions/) 516 | 517 | * [Setting unnecessary/redundant channels to an uniform value can help alleviate co-compression artifacts of BC1 or BC3 normal maps. If we assume 1=x*x+y*y+z*z, then we only need to store 2 channels. To achieve the best result, store 1 of the 2 channels in alpha, because alpha has more bits and is interpolated separately for BC3.](https://realtimecollisiondetection.net/blog/?p=28#more-28) 518 | 519 | ### Graphics APIs 520 | 521 | * Glsl [mod](https://registry.khronos.org/OpenGL-Refpages/gl4/html/mod.xhtml) is slightly different from hlsl [fmod](https://learn.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-fmod) 522 | 523 | * [D3D12 reading beyond the end of the bound array behavior](https://gamedev.net/forums/topic/677978-hlsl-reading-outside-array-safe/5288390/) 524 | 525 | * [Unlike short-circuit evaluation of &&, ||, and ?: in C, HLSL expressions never short-circuit an evaluation because they are vector operations. All sides of the expression are always evaluated.](https://learn.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-operators#boolean-math-operators) 526 | 527 | * [D3D12_FILTER is arranged in a bitwise pattern](https://docs.microsoft.com/en-us/windows/win32/api/d3d12/ne-d3d12-d3d12_filter#remarks) 528 | 529 | * [D3D12 Command lists are created in the recording state, to call ID3D12CommandAllocator::Reset(), close associated command lists first](https://docs.microsoft.com/en-us/windows/win32/api/d3d12/nf-d3d12-id3d12graphicscommandlist-close) 530 | 531 | * [Windows 10 adds a border around a window](https://stackoverflow.com/questions/34139450/getwindowrect-returns-a-size-including-invisible-borders) 532 | 533 | * [When using an image view of a depth/stencil image to populate a descriptor set (e.g. for sampling in the shader, or for use as an input attachment), the aspectMask must only include one bit and selects whether the image view is used for depth reads (i.e. using a floating-point sampler or input attachment in the shader) or stencil reads (i.e. using an unsigned integer sampler or input attachment in the shader). When an image view of a depth/stencil image is used as a depth/stencil framebuffer attachment, the aspectMask is ignored and both depth and stencil image subresources are used.](https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/VkImageViewCreateInfo.html) 534 | 535 | * [VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT_EXT](https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/VkDescriptorBindingFlagBitsEXT.html) [can be used to allow bindings to not contain valid descriptors if they are not dynamically used.](https://www.gamedev.net/forums/topic/703087-vulkan-sampler-array/?tab=comments#comment-5409450) 536 | 537 | * [Lazily allocated memory is only allowed to be bound to a VkImage whose usage flags include VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT.](https://vulkan.lunarg.com/doc/view/1.0.33.0/linux/vkspec.chunked/ch10s02.html#memory-device-lazy_allocation) 538 | 539 | * [Transient attachments are framebuffer attachments that begin in an uninitialized or cleared state at the beginning of a renderpass, are written by one or more subpasses, consumed by one or more subpasses and are ultimately discarded at the end of the renderpass.](https://gpuopen.com/vulkan-renderpasses/) 540 | 541 | * [Vulkan NDC is right handed and it's y axis points down.](http://anki3d.org/vulkan-coordinate-system/) [A way to work around this is to negate the second element at the second row of the projection matrix.](https://github.com/Overv/VulkanTutorial/blob/master/code/23_texture_image.cpp#L1131) 542 | 543 | * [The perspective projection matrix generated by GLM uses the OpenGL depth range of -1.0 to 1.0 by default. We need to configure it to use the Vulkan range of 0.0 to 1.0 by using the GLM_FORCE_DEPTH_ZERO_TO_ONE definition.](https://vulkan-tutorial.com/Depth_buffering) 544 | 545 | * [DirectXMath uses row major to store matrix](https://docs.microsoft.com/en-us/windows/desktop/dxmath/ovw-xnamath-reference-functions-matrix) while [GLM uses column major.](https://glm.g-truc.net/0.9.2/api/a00001.html) [DirectXMath uses right multiply](https://github.com/microsoft/DirectXMath/blob/master/Inc/DirectXMathMatrix.inl#L1118) while [GLM use left multiply.](https://github.com/g-truc/glm/blob/0.9.9.0/glm/gtc/matrix_transform.inl#L11) 546 | 547 | * [Cross product is defined with right handedness](https://en.wikipedia.org/wiki/Cross_product#Definition) and [rotation matrix is also defined with right handedness.](https://en.wikipedia.org/wiki/Rotation_matrix#In_three_dimensions) Therefore world space is often defined with right handedness. [But DirectX is an exception](https://docs.microsoft.com/en-us/windows/desktop/api/directxmath/nf-directxmath-xmmatrixrotationrollpitchyaw). Therefore its world space is defined with left handedness. 548 | 549 | * The handedness of lookat function and perspective function must match each other. [DirectXMath expecilitly provides both](https://github.com/microsoft/DirectXMath/blob/master/Inc/DirectXMathMatrix.inl#L1934) while [GLM use right hand coordinates by default](https://github.com/g-truc/glm/blob/master/manual.md#-216-glm_force_left_handed-force-left-handed-coordinate-system) [unless GLM_FORCE_LEFT_HANDED is specified.](https://github.com/g-truc/glm/blob/master/glm/detail/setup.hpp#L485) They are not affected by the handedness of world coordinate system because view matrix is constructed by listing all three axes in the world system and inverse it (with some extra steps to deal with origin offset). It does not concern handedness. 550 | 551 | * [D3D (and Vulkan) texture start at top-left corner while OpenGL texture start from bottom-left corner.](https://docs.microsoft.com/en-us/windows/desktop/direct3d9/texture-coordinates) 552 | 553 | * [D3D (and Vulkan) z value in NDC ranges from 0 to 1 while OpenGL's (hence GLM's) z value in NDC ranges from -1 to 1 by default.](https://docs.microsoft.com/en-us/windows/desktop/direct3d9/projection-transform) 554 | 555 | * [D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE is actually NON Pixel Shader SHADER RESOURCE. It's for VS, HS, DS and GS.](https://docs.microsoft.com/en-us/windows/desktop/api/d3d12/ne-d3d12-d3d12_resource_states) 556 | 557 | * [D3D SV_Position.w is w](https://microsoft.github.io/DirectX-Specs/d3d/archive/D3D11_3_FunctionalSpec.htm#16.3%20Pixel%20Shader%20Inputs) [while](https://www.gamedev.net/forums/topic/698741-w-component-of-sv_positiongl_fragcoord/?tab=comments#comment-5397351) [gl_FragCoord.w is 1/w.](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/gl_FragCoord.xhtml) 558 | 559 | * [D3D12 unnamed command queue being released while still in use by the GPU.](https://www.gamedev.net/forums/topic/700769-d3d12-unnamed-command-queue-being-final-released-while-still-in-use-by-the-gpu/?tab=comments#comment-5399076) 560 | 561 | * [D3D9 specify back buffer counts](https://docs.microsoft.com/en-us/windows/desktop/direct3d9/d3dpresent-parameters) while [D3D11 specify buffer counts.](https://docs.microsoft.com/en-us/windows/desktop/api/dxgi/ns-dxgi-dxgi_swap_chain_desc) 562 | 563 | * [D3D11 has early z-test by default. It will be automatically used if the situations allow it. It's different from hierarchical z test or hi-z.](https://stackoverflow.com/questions/17898738/early-z-test-depth-test-in-directx-11) 564 | 565 | * [Early Z will be disabled if you have discard in the pixel shader](https://www.khronos.org/opengl/wiki/Early_Fragment_Test#Limitations) or [output depth from pixel shader (unless using conservative output depth).](https://microsoft.github.io/DirectX-Specs/d3d/archive/D3D11_3_FunctionalSpec.htm#16.9.3%20Conservative%20Output%20Depth%20(Conservative%20oDepth)) 566 | 567 | * [Register space (shader space) in DX12 can be used as a way to separate uniform variables just like set in Vulkan does.](https://twitter.com/longbool/status/1137170662353788929) 568 | 569 | * [NonUniformResourceIndex](https://www.asawicki.info/news_1608_direct3d_12_-_watch_out_for_non-uniform_resource_index) 570 | 571 | * [Untangling Direct3D 12 Memory Heap Types and Pools](https://asawicki.info/news_1755_untangling_direct3d_12_memory_heap_types_and_pools) 572 | 573 | * [ReBAR](https://gpuopen.com/learn/using-d3d12-heap-type-gpu-upload/) 574 | 575 | ### C & C++ 576 | 577 | * [Error C2102: '&' requires l-value](https://stackoverflow.com/a/65547916) 578 | 579 | * [Brainfuck is the name of a real programming language.](https://en.wikipedia.org/wiki/Brainfuck) 580 | 581 | * [Character literals are treated as int in C whereas char in C++.](https://www.geeksforgeeks.org/g-fact-54/) 582 | 583 | * [Sizeof operator will generate 0 for an empty structure in C whereas 1 for an empty structure in C++.](https://www.geeksforgeeks.org/difference-c-structures-c-structures/) 584 | 585 | * [Pass NULL as C++ function argument can lead to ambiguous function call when the function is overloaded to take int as argument.](https://www.geeksforgeeks.org/understanding-nullptr-c/) 586 | 587 | * [C allows a void* pointer to be assigned to any pointer type without a cast, whereas C++ requires an explicit cast.](https://www.geeksforgeeks.org/g-fact-12-2/) 588 | 589 | * [Virtual function can be inlined when called using the object of that class instead of base class reference or pointer.](https://www.geeksforgeeks.org/inline-virtual-function/) 590 | 591 | * [Virtual functions can be private in C++.](https://www.geeksforgeeks.org/can-virtual-functions-be-private-in-c/) 592 | 593 | * [C++ only allows static const integral members to be initialized inline before C++ 11.](https://stackoverflow.com/questions/225089/why-cant-we-initialize-members-inside-a-structure) 594 | 595 | * [The size of an instance of an empty class is 1.](https://stackoverflow.com/questions/621616/c-what-is-the-size-of-an-object-of-an-empty-class) 596 | 597 | * [Access specifiers are checked at compile time. At run time, only the function corresponding to the pointed object (the virtual function) is called and access specifier is not checked.](https://www.geeksforgeeks.org/what-happens-when-more-restrictive-access-is-given-in-a-derived-class-method-in-c/) 598 | 599 | * [The sign of a char is implementation-defined.](https://stackoverflow.com/questions/17097537/why-is-char-signed-by-default-in-c/17097580) 600 | 601 | * [The parentheses for sizeof operator is not necessary when passing in an expression instead of the name of a type.](https://stackoverflow.com/a/18898832/7037639) 602 | 603 | * [The index and array can be switched and it still works.](https://stackoverflow.com/a/11503403/7037639) 604 | 605 | * [Const function can only return const reference.](https://stackoverflow.com/questions/30146562/error-qualifiers-dropped-in-binding-reference-of-type-x-to-initializer-of-type) [Const function can return non-const pointer, as long as it is not the address of a member varible (i.e. it is ok to return a copy of a pointer member variable).](https://stackoverflow.com/a/8788917/7037639) 606 | 607 | * [Calling a virtual function from a constructor or destructor dispatches the function as if the object's dynamic type were that currently being constructed or destroyed.](https://www.geeksforgeeks.org/calling-virtual-methods-in-constructordestructor-in-cpp/) [It is technically ok if the current hierarchy has the implementation but it is not a good practice.](https://stackoverflow.com/a/12094241/7037639) 608 | 609 | * [Integer size depends on actual implementation. The standard only specifies the minimum range. Pointer size on the other hand depends on the target machine.](https://stackoverflow.com/questions/11438794/is-the-size-of-c-int-2-bytes-or-4-bytes) 610 | 611 | ### OS 612 | 613 | * [Windows API ChangeDisplaySettingsEx sometimes can cause flickering on monitors.](https://github.com/glfw/glfw/issues/527#issuecomment-351476987) 614 | 615 | * [Interrupt signals generated in the terminal are delivered to the active process group, which includes both parent and children processes.](https://unix.stackexchange.com/a/176242) 616 | 617 | * [When using setpgid to separate child processes into different groups, calling setpgid in both parent and child processes is the best approach because it can avoid EPERM and EACCES error. EPERM can be caused by calling setpgid(pid, pgid) for group members (where pid is not equal to pgid) before calling setpgid(pid, pgid) for group leader (where pid is equal to pgid). EACCES can be caused by calling setpgid(pid, pgid) in parent process where the child process (either group member or leader) with pid has already called exec or its variants. To solve these two race conditions, make sure to call setpgid in both parent and child processes.](https://linux.die.net/man/2/setpgid) 618 | 619 | * [Establishing an alternate signal stack is useful if a process expects that it may exhaust its standard stack.](http://man7.org/linux/man-pages/man2/sigaltstack.2.html) [This is useful when using makecontext to prepare the context to be swapped.](http://man7.org/linux/man-pages/man3/makecontext.3.html) 620 | 621 | * [When a handler function is invoked on a signal, that signal is automatically blocked (in addition to any other signals that are already in the process’s signal mask) during the time the handler is running.](https://www.gnu.org/software/libc/manual/html_node/Blocking-for-Handler.html#Blocking-for-Handler) 622 | 623 | * [When successful, swapcontext() does not return for the \*ucp. But we may get to the same context here again by setting a previously saved \*oucp as \*ucp using swapcontext or setcontext. In this case swapcontext() returns 0 for the \*oucp.](https://linux.die.net/man/3/swapcontext) 624 | --------------------------------------------------------------------------------