<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.9.3">Jekyll</generator><link href="https://vimontgames.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://vimontgames.github.io/" rel="alternate" type="text/html" /><updated>2024-01-11T00:47:19+00:00</updated><id>https://vimontgames.github.io/feed.xml</id><title type="html">vimontgames.github.io</title><subtitle>vimontgames.github.io</subtitle><author><name>Benoit Vimont</name></author><entry><title type="html">BLAS Build and Update</title><link href="https://vimontgames.github.io/rendering/BLAS-Building-And-Update/" rel="alternate" type="text/html" title="BLAS Build and Update" /><published>2024-01-08T00:00:00+00:00</published><updated>2024-01-08T00:00:00+00:00</updated><id>https://vimontgames.github.io/rendering/BLAS-Building-And-Update</id><content type="html" xml:base="https://vimontgames.github.io/rendering/BLAS-Building-And-Update/">&lt;h2 id=&quot;whats-the-deal-with-blases&quot;&gt;What’s the deal with BLASes?&lt;/h2&gt;

&lt;p&gt;A BLAS is the local accelleration structures required for raytracing stuff using modern graphic APIs.&lt;/p&gt;

&lt;p&gt;Basically you will need BLASes that represent mesh instances in scene, and add them all to a TLAS.&lt;/p&gt;

&lt;p&gt;It’s easy to build a BLAS right after mesh loading, but still there a few things to consider :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;BLAS need to separate opaque vs. non-opaques batchs&lt;/li&gt;
  &lt;li&gt;Dynamic geometry needs to update BLAS when it changes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We end up having a different strategy for static and opaque geometries :&lt;/p&gt;

&lt;h2 id=&quot;static-geometry&quot;&gt;Static Geometry&lt;/h2&gt;

&lt;p&gt;These geometries do not change often. Ideally we would like to build them once, share them as much as possible
and destroy them when they are no more needed (no more instance using it).&lt;/p&gt;

&lt;p&gt;These geometries are build with the &lt;strong&gt;FAST_TRACE&lt;/strong&gt; flag only because we will never update them.&lt;/p&gt;

&lt;p&gt;When building BLAS right after loading a mesh, it would be convenient to know in advance which parts 
are using &lt;strong&gt;alphablend&lt;/strong&gt; or &lt;strong&gt;alphatest&lt;/strong&gt;, but it’s also convenient to be able to use the same mesh 
with different material instances.&lt;/p&gt;

&lt;p&gt;In &lt;a href=&quot;https://github.com/vimontgames/vgframework&quot;&gt;vgframework&lt;/a&gt;, the mesh models are cooked without 
knowledge of the materials used and it’s up to every &lt;strong&gt;MeshModelInstance&lt;/strong&gt; to choose the materials to use.&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;MeshModel&lt;/strong&gt; holds a map of its different BLAses variants. A key is built from the materials used by the 
graphic instance so that the same configuration (e.g. Opaque/Opaque/Alphablend) return the same BLAS and 
increase its RefCount or create it when needed.&lt;/p&gt;

&lt;h3 id=&quot;examples&quot;&gt;Examples&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;3 cubes using the same opaque material&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://vimontgames.github.io/assets/images/BLAStest/1.png&quot;&gt;&lt;img src=&quot;http://vimontgames.github.io/assets/images/BLAStest/1.png&quot; alt=&quot;3 cubes using the same opaque material&quot; /&gt;&lt;/a&gt;
The 3 cube are sharing the same BLAS.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3 cubes using different opaque materials&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://vimontgames.github.io/assets/images/BLAStest/2.png&quot;&gt;&lt;img src=&quot;http://vimontgames.github.io/assets/images/BLAStest/2.png&quot; alt=&quot;3 cubes using different opaque materials&quot; /&gt;&lt;/a&gt;
The 3 cube are still sharing the same BLAS, because new materials are still opaque.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3 cubes using different materials but one is alphablend&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://vimontgames.github.io/assets/images/BLAStest/3.png&quot;&gt;&lt;img src=&quot;http://vimontgames.github.io/assets/images/BLAStest/3.png&quot; alt=&quot;3 cubes using different materials but one is alphablend&quot; /&gt;&lt;/a&gt;
The 2 opaque cubes are sharing the same BLAS made of one opaque batch while the last one is using itw own 
BLAS made of 1 non-opaque batch.&lt;/p&gt;

&lt;h2 id=&quot;dynamic-geometry&quot;&gt;Dynamic geometry&lt;/h2&gt;

&lt;p&gt;As opposed to static geometries, dynamic geometries change every frame (e.g. skinned meshes) so we build them
with the &lt;strong&gt;FAST_BUILD&lt;/strong&gt; and &lt;strong&gt;ALLOW_UPDATE&lt;/strong&gt; flags to reduce the cost of this update.&lt;/p&gt;

&lt;h3 id=&quot;skinning&quot;&gt;Skinning&lt;/h3&gt;

&lt;p&gt;During views culling, the skins instances visible in any view (incl. shadow casting lights POV) are added to a
lock-free list using atomics.&lt;/p&gt;

&lt;p&gt;The skinning for all these instances is done once (per LOD) in a single vertex buffer. When updating BLAS their
offset in this buffer is used as with a regular Vertex Buffer excepted here the buffer is the output of skinning
compute shader.&lt;/p&gt;

&lt;p&gt;Dynamic geometries BLASes are not shared with this design, but it could be useful in the future if animation
instancing is needed (e.g. to render crowds).&lt;/p&gt;</content><author><name>Benoit Vimont</name></author><category term="Rendering" /><category term="RayTracing" /><summary type="html">Strategy for building BLAS variants and updating BLASes</summary></entry><entry><title type="html">Bindless Table</title><link href="https://vimontgames.github.io/rendering/Bindless-Table/" rel="alternate" type="text/html" title="Bindless Table" /><published>2024-01-08T00:00:00+00:00</published><updated>2024-01-08T00:00:00+00:00</updated><id>https://vimontgames.github.io/rendering/Bindless-Table</id><content type="html" xml:base="https://vimontgames.github.io/rendering/Bindless-Table/">&lt;p&gt;I’ve been experimenting with Bindless rendering using DirectX12 &amp;amp; Vulkan APIs recently.&lt;/p&gt;

&lt;p&gt;Here is the layout I currently use for bindless table :&lt;/p&gt;

&lt;h2 id=&quot;table-layout&quot;&gt;Table Layout&lt;/h2&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Type&lt;/th&gt;
      &lt;th&gt;Range&lt;/th&gt;
      &lt;th&gt;Space&lt;/th&gt;
      &lt;th&gt;Binding&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Texture1D (float4)&lt;/td&gt;
      &lt;td&gt;[0    ..16383]&lt;/td&gt;
      &lt;td&gt;10&lt;/td&gt;
      &lt;td&gt;0&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Texture2D (float4)&lt;/td&gt;
      &lt;td&gt;[0    ..16383]&lt;/td&gt;
      &lt;td&gt;20&lt;/td&gt;
      &lt;td&gt;0&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Texture2D (uint)&lt;/td&gt;
      &lt;td&gt;[0    ..16383]&lt;/td&gt;
      &lt;td&gt;21&lt;/td&gt;
      &lt;td&gt;0&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Texture3D (float4)&lt;/td&gt;
      &lt;td&gt;[0    ..16383]&lt;/td&gt;
      &lt;td&gt;30&lt;/td&gt;
      &lt;td&gt;0&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;ByteAddressBuffer&lt;/td&gt;
      &lt;td&gt;[16384..32767]&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
      &lt;td&gt;1&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;RWTexture1D&lt;/td&gt;
      &lt;td&gt;[32768..40959]&lt;/td&gt;
      &lt;td&gt;210&lt;/td&gt;
      &lt;td&gt;2&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;RWTexture2D&lt;/td&gt;
      &lt;td&gt;[32768..40959]&lt;/td&gt;
      &lt;td&gt;220&lt;/td&gt;
      &lt;td&gt;2&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;RWTexture3D&lt;/td&gt;
      &lt;td&gt;[32768..40959]&lt;/td&gt;
      &lt;td&gt;230&lt;/td&gt;
      &lt;td&gt;2&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;RWByteAddressBuffer&lt;/td&gt;
      &lt;td&gt;[40960..49151]&lt;/td&gt;
      &lt;td&gt;200&lt;/td&gt;
      &lt;td&gt;3&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;RaytracingAccelerationStructure&lt;/td&gt;
      &lt;td&gt;[49152..49167]&lt;/td&gt;
      &lt;td&gt;-&lt;/td&gt;
      &lt;td&gt;4&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Notes:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;The DirectX12 version uses the &lt;em&gt;Space&lt;/em&gt; value to alias the different types of resource view formats&lt;/li&gt;
  &lt;li&gt;The Vulkan version uses the &lt;em&gt;Binding&lt;/em&gt; value to differenciate between the different types of resource views&lt;/li&gt;
  &lt;li&gt;Several TLAS can be used if multiple views are used. The current value implies a maximum of 16 views using RayTracing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In case you want more details, check the file &lt;a href=&quot;https://github.com/vimontgames/vgframework/blob/master/data/Shaders/system/table.hlsli&quot;&gt;table.hlsi&lt;/a&gt; in the repo.&lt;/p&gt;

&lt;h2 id=&quot;reserved-slots&quot;&gt;Reserved Slots&lt;/h2&gt;

&lt;p&gt;By default, a new resource requiring a view will be created allocating a new bindless handle in these ranges, but it’s convenient to have some hard-coded slots :&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;To avoid an extra indirection (e.g. passing buffer handle as root constant) :&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-cpp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;PS_Output&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;PS_Forward&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;VS_Output&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_input&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;PS_Output&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;output&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;PS_Output&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    
    &lt;span class=&quot;n&quot;&gt;ViewConstants&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;viewConstants&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;viewConstants&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Load&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;getBuffer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;RESERVEDSLOT_BUFSRV_VIEWCONSTANTS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt;

    &lt;span class=&quot;p&quot;&gt;[...]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;To fallback to missing texture :&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-cpp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;m_defaultTexture&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;device&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;createTexture&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;texDesc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;DefaultTex2D&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;initData&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ReservedSlot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;BINDLESS_TEXTURE_INVALID&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;VG_ASSERT&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;m_defaultTexture&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;getTextureHandle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;BINDLESS_TEXTURE_INVALID&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        
&lt;span class=&quot;c1&quot;&gt;// copy descriptor to all 'texture' slots&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;uint&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;BINDLESS_TEXTURE_START&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;BINDLESS_TEXTURE_COUNT&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;BINDLESS_TEXTURE_INVALID&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;copyTextureHandle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;m_defaultTexture&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;To initialize shader structs with proper default values (e.g. default albedo, default normal map etc…) :&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-cpp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;GPUMaterialData&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;cp&quot;&gt;#ifdef __cplusplus
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;GPUMaterialData&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;setAlbedoTextureHandle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;RESERVEDSLOT_TEXSRV_DEFAULT_ALBEDO&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;setNormalTextureHandle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;RESERVEDSLOT_TEXSRV_DEFAULT_NORMAL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;setPBRTextureHandle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;RESERVEDSLOT_TEXSRV_DEFAULT_PBR&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;   
    &lt;span class=&quot;cp&quot;&gt;#endif 
&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// .x = albedo | normal &lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// .y = pbr | unused &lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;uint4&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;textures&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; 

    &lt;span class=&quot;p&quot;&gt;[...]&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;These custom hardcoded slots are defined compile-time and “allocated” bottom-up before the last value of the range used as invalid value.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Type&lt;/th&gt;
      &lt;th&gt;Name&lt;/th&gt;
      &lt;th&gt;Value&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Texture&lt;/td&gt;
      &lt;td&gt;PBR&lt;/td&gt;
      &lt;td&gt;16379&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Texture&lt;/td&gt;
      &lt;td&gt;Normal&lt;/td&gt;
      &lt;td&gt;16380&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Texture&lt;/td&gt;
      &lt;td&gt;Albedo&lt;/td&gt;
      &lt;td&gt;16381&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Texture&lt;/td&gt;
      &lt;td&gt;ImGui&lt;/td&gt;
      &lt;td&gt;16382&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Texture&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;Default&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;16383&lt;/strong&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Buffer&lt;/td&gt;
      &lt;td&gt;InstanceData&lt;/td&gt;
      &lt;td&gt;32763&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Buffer&lt;/td&gt;
      &lt;td&gt;SkinningMatrices&lt;/td&gt;
      &lt;td&gt;32764&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Buffer&lt;/td&gt;
      &lt;td&gt;LightsConstants&lt;/td&gt;
      &lt;td&gt;32765&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Buffer&lt;/td&gt;
      &lt;td&gt;ViewConstants&lt;/td&gt;
      &lt;td&gt;32766&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Buffer&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;Default&lt;/strong&gt;&lt;/td&gt;
      &lt;td&gt;&lt;strong&gt;32767&lt;/strong&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&quot;debugging&quot;&gt;Debugging&lt;/h2&gt;

&lt;p&gt;Using GPU debug tools like &lt;a href=&quot;https://renderdoc.org/&quot;&gt;Renderdoc&lt;/a&gt; or &lt;a href=&quot;https://devblogs.microsoft.com/pix/&quot;&gt;PIX&lt;/a&gt;, it is possible to view the descriptor used and the resource contents.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://vimontgames.github.io/assets/images/BindlessTable/BindlessTable.png&quot;&gt;&lt;img src=&quot;http://vimontgames.github.io/assets/images/BindlessTable/BindlessTable.png&quot; alt=&quot;Bindless tables in Renderdoc&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content><author><name>Benoit Vimont</name></author><category term="Rendering" /><category term="Bindless" /><summary type="html">Experiments with Bindless rendering using DirectX12 &amp; Vulkan APIs</summary></entry></feed>