CustomDX12API.cpp 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456
  1. #include "CustomDX12API.h"
  2. #include <DX12Buffer.h>
  3. #include <DX12CommandQueue.h>
  4. #include <DX12Shader.h>
  5. #include <DX12Texture.h>
  6. #include <DX12TLAS.h>
  7. #include "CustomChunkAnyHitShader.h"
  8. #include "CustomChunkClosestHitShader.h"
  9. #include "CustomChunkIntersectionShader.h"
  10. #include "CustomCustomMissShader.h"
  11. #include "CustomCustomRayGenShader.h"
  12. #include "CustomDefaultAnyHitShader.h"
  13. #include "CustomDefaultClosestHitShader.h"
  14. #include "CustomSimpleBlocksAnyHitShader.h"
  15. #include "CustomSimpleBlocksClosestHitShader.h"
  16. #include "Dimension.h"
  17. #include "DX12ChunkData.h"
  18. #include "World.h"
  19. using namespace Framework;
  20. CustomDX12API::CustomDX12API()
  21. : DirectX12(),
  22. sbtChunkTextureIdBufferOffset(0),
  23. sbtChunkIndexBufferOffset(0),
  24. sbtChunkDataBufferOffset(0),
  25. sbtChunkLightBufferOffset(0),
  26. sbtSimpleBlocksTextureIdBufferOffset(0),
  27. sbtSimpleBlocksIndexBufferOffset(0),
  28. sbtSimpleBlocksVertexDataBufferOffset(0),
  29. sbtSimpleBlocksIndexOffsetBufferOffset(0),
  30. sbtSimpleBlocksLightBufferOffset(0),
  31. sbtDefaultLightBufferOffset(0),
  32. globalLightBufferOffset(0),
  33. chunkHitGroup(0),
  34. simpleBlocksHitGroup(0),
  35. lightInfoBuffer(0),
  36. defaultLightBuffer(0)
  37. {}
  38. CustomDX12API::~CustomDX12API()
  39. {
  40. if (lightInfoBuffer)
  41. {
  42. lightInfoBuffer->release();
  43. }
  44. if (defaultLightBuffer)
  45. {
  46. defaultLightBuffer->release();
  47. }
  48. }
  49. void CustomDX12API::initializePipeline()
  50. {
  51. if (!lightInfoBuffer)
  52. {
  53. lightInfoBuffer = new DX12Buffer(sizeof(DX12ShaderLightInfo),
  54. device,
  55. dynamic_cast<DX12CommandQueue*>(directCommandQueue->getThis()),
  56. D3D12_RESOURCE_FLAG_NONE);
  57. lightInfoBuffer->setData(&lightInfo, 1);
  58. lightInfoBuffer->setLength(sizeof(DX12ShaderLightInfo));
  59. }
  60. if (!defaultLightBuffer)
  61. {
  62. defaultLightBuffer = new DX12Buffer(sizeof(unsigned char),
  63. device,
  64. dynamic_cast<DX12CommandQueue*>(directCommandQueue->getThis()),
  65. D3D12_RESOURCE_FLAG_NONE);
  66. defaultLightBuffer->setLength(6);
  67. unsigned char defaultLight[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
  68. defaultLightBuffer->setData(defaultLight, 1);
  69. defaultLightBuffer->copyToGPU();
  70. }
  71. if (pipeline->getShaders().getEntryCount() == 0)
  72. { // add default shaders
  73. pipeline->zGlobalSignature()->addRegisterUsageLinkedToDescriptorHeap(
  74. 0, DX12_SHADER_REGISTER_S_SAMPLER, 0, 0, SAMPLER_DESCRIPTOR_HEAP);
  75. pipeline->zGlobalSignature()->addRegisterUsageLinkedToDescriptorHeap(
  76. firstTextureHeapIndex,
  77. DX12_SHADER_REGISTER_T_SHADER_RESOURCE,
  78. 0,
  79. 1,
  80. GLOBAL_DESCRIPTOR_HEAP,
  81. 1);
  82. globalLightBufferOffset
  83. = pipeline->zGlobalSignature()
  84. ->addRegisterUsageLinkedToShaderBindingTable(
  85. DX12_SHADER_REGISTER_B_CONST_BUFFER, 0, 1);
  86. globalTLASoffset = pipeline->zGlobalSignature()
  87. ->addRegisterUsageLinkedToShaderBindingTable(
  88. DX12_SHADER_REGISTER_T_SHADER_RESOURCE, 0);
  89. pipeline->zGlobalSignature()->addRegisterUsageLinkedToDescriptorHeap(
  90. 0, DX12_SHADER_REGISTER_U_UNORDERED_ACCESS, 0);
  91. pipeline->zGlobalSignature()->addRegisterUsageLinkedToDescriptorHeap(
  92. 1, DX12_SHADER_REGISTER_U_UNORDERED_ACCESS, 1);
  93. globalRayGenerationSettingsOffset
  94. = pipeline->zGlobalSignature()
  95. ->addRegisterUsageLinkedToShaderBindingTable(
  96. DX12_SHADER_REGISTER_B_CONST_BUFFER, 0);
  97. DX12Shader* rayGenShader = new DX12Shader(
  98. CustomCustomRayGenShader, sizeof(CustomCustomRayGenShader));
  99. // RayGen from RayGen.hlsl
  100. DX12ShaderSignature* rayGenSignature = new DX12ShaderSignature();
  101. defaultRayGenerationShaderFunction = new DX12ShaderFunction(
  102. "RayGen", rayGenSignature, DX12_SHADER_FUNCTION_TYPE_RAY_GEN);
  103. rayGenShader->addFunction(defaultRayGenerationShaderFunction);
  104. pipeline->addShader(rayGenShader);
  105. DX12Shader* missShader = new DX12Shader(
  106. CustomCustomMissShader, sizeof(CustomCustomMissShader));
  107. // Miss from Miss.hlsl
  108. missShader->addFunction(new DX12ShaderFunction(
  109. "Miss", new DX12ShaderSignature(), DX12_SHADER_FUNCTION_TYPE_MISS));
  110. pipeline->addShader(missShader);
  111. DX12ShaderSignature* hitSignature = new DX12ShaderSignature();
  112. sbtTextureIdBufferOffset
  113. = hitSignature->addRegisterUsageLinkedToShaderBindingTable(
  114. DX12_SHADER_REGISTER_T_SHADER_RESOURCE, 1, 2);
  115. sbtIndexBufferOffset
  116. = hitSignature->addRegisterUsageLinkedToShaderBindingTable(
  117. DX12_SHADER_REGISTER_T_SHADER_RESOURCE, 1, 3);
  118. sbtVertexDataBufferOffset
  119. = hitSignature->addRegisterUsageLinkedToShaderBindingTable(
  120. DX12_SHADER_REGISTER_T_SHADER_RESOURCE, 1, 4);
  121. sbtPolygonSizeBufferOffset
  122. = hitSignature->addRegisterUsageLinkedToShaderBindingTable(
  123. DX12_SHADER_REGISTER_T_SHADER_RESOURCE, 1, 5);
  124. sbtDefaultLightBufferOffset
  125. = hitSignature->addRegisterUsageLinkedToShaderBindingTable(
  126. DX12_SHADER_REGISTER_T_SHADER_RESOURCE, 1, 6);
  127. DX12Shader* anyHitShader = new DX12Shader(
  128. CustomDefaultAnyHitShader, sizeof(CustomDefaultAnyHitShader));
  129. DX12ShaderFunction* anyHitFunction = new DX12ShaderFunction(
  130. "AnyHit", hitSignature, DX12_SHADER_FUNCTION_TYPE_ANY_HIT);
  131. // AnyHit from AnyHit.hlsl
  132. anyHitShader->addFunction(anyHitFunction);
  133. pipeline->addShader(anyHitShader);
  134. DX12Shader* hitShader = new DX12Shader(CustomDefaultClosestHitShader,
  135. sizeof(CustomDefaultClosestHitShader));
  136. // ClosestHit from Hit.hlsl
  137. DX12ShaderFunction* closestHitFunction
  138. = new DX12ShaderFunction("ClosestHit",
  139. dynamic_cast<DX12ShaderSignature*>(hitSignature->getThis()),
  140. DX12_SHADER_FUNCTION_TYPE_CLOSEST_HIT);
  141. hitShader->addFunction(closestHitFunction);
  142. pipeline->addShader(hitShader);
  143. defaultHitGroup = new DX12ShaderHitGroup("HitGroup");
  144. defaultHitGroup->setAttributeSize(8);
  145. defaultHitGroup->setPayloadSize(40 * DEFAULT_MAX_TRANSPARENT_HITS + 4);
  146. defaultHitGroup->setAnyHitShaderFunction(anyHitFunction);
  147. defaultHitGroup->setClosestHitShaderFunction(closestHitFunction);
  148. pipeline->addHitGroup(defaultHitGroup);
  149. // Chunk ray traversal shaders
  150. DX12ShaderSignature* chunkHitSignature = new DX12ShaderSignature();
  151. sbtChunkTextureIdBufferOffset
  152. = chunkHitSignature->addRegisterUsageLinkedToShaderBindingTable(
  153. DX12_SHADER_REGISTER_T_SHADER_RESOURCE, 1, 2);
  154. sbtChunkIndexBufferOffset
  155. = chunkHitSignature->addRegisterUsageLinkedToShaderBindingTable(
  156. DX12_SHADER_REGISTER_T_SHADER_RESOURCE, 1, 3);
  157. sbtChunkLightBufferOffset
  158. = chunkHitSignature->addRegisterUsageLinkedToShaderBindingTable(
  159. DX12_SHADER_REGISTER_T_SHADER_RESOURCE, 1, 4);
  160. sbtChunkDataBufferOffset
  161. = chunkHitSignature->addRegisterUsageLinkedToShaderBindingTable(
  162. DX12_SHADER_REGISTER_B_CONST_BUFFER, 0, 2);
  163. DX12Shader* chunkIntersectionShader
  164. = new DX12Shader(CustomChunkIntersectionShader,
  165. sizeof(CustomChunkIntersectionShader));
  166. DX12ShaderFunction* chunkIntersectionFunction
  167. = new DX12ShaderFunction("ChunkIntersection",
  168. chunkHitSignature,
  169. DX12_SHADER_FUNCTION_TYPE_INTERSECTION);
  170. chunkIntersectionShader->addFunction(chunkIntersectionFunction);
  171. pipeline->addShader(chunkIntersectionShader);
  172. DX12Shader* chunkAnyHitShader = new DX12Shader(
  173. CustomChunkAnyHitShader, sizeof(CustomChunkAnyHitShader));
  174. DX12ShaderFunction* chunkAnyHitFunction = new DX12ShaderFunction(
  175. "ChunkAnyHit",
  176. dynamic_cast<DX12ShaderSignature*>(chunkHitSignature->getThis()),
  177. DX12_SHADER_FUNCTION_TYPE_ANY_HIT);
  178. chunkAnyHitShader->addFunction(chunkAnyHitFunction);
  179. pipeline->addShader(chunkAnyHitShader);
  180. DX12Shader* chunkClosestHitShader = new DX12Shader(
  181. CustomChunkClosestHitShader, sizeof(CustomChunkClosestHitShader));
  182. DX12ShaderFunction* chunkClosestHitFunction = new DX12ShaderFunction(
  183. "ChunkClosestHit",
  184. dynamic_cast<DX12ShaderSignature*>(chunkHitSignature->getThis()),
  185. DX12_SHADER_FUNCTION_TYPE_CLOSEST_HIT);
  186. chunkClosestHitShader->addFunction(chunkClosestHitFunction);
  187. pipeline->addShader(chunkClosestHitShader);
  188. chunkHitGroup = new DX12ShaderHitGroup("ChunkHitGroup");
  189. chunkHitGroup->setIntersectionShaderFunction(chunkIntersectionFunction);
  190. chunkHitGroup->setAnyHitShaderFunction(chunkAnyHitFunction);
  191. chunkHitGroup->setClosestHitShaderFunction(chunkClosestHitFunction);
  192. chunkHitGroup->setAttributeSize(32);
  193. chunkHitGroup->setPayloadSize(40 * DEFAULT_MAX_TRANSPARENT_HITS + 4);
  194. pipeline->addHitGroup(chunkHitGroup);
  195. // simple blocks hit shaders
  196. DX12ShaderSignature* simpleBlocksHitSignature
  197. = new DX12ShaderSignature();
  198. sbtSimpleBlocksTextureIdBufferOffset
  199. = simpleBlocksHitSignature
  200. ->addRegisterUsageLinkedToShaderBindingTable(
  201. DX12_SHADER_REGISTER_T_SHADER_RESOURCE, 1, 2);
  202. sbtSimpleBlocksIndexBufferOffset
  203. = simpleBlocksHitSignature
  204. ->addRegisterUsageLinkedToShaderBindingTable(
  205. DX12_SHADER_REGISTER_T_SHADER_RESOURCE, 1, 3);
  206. sbtSimpleBlocksVertexDataBufferOffset
  207. = simpleBlocksHitSignature
  208. ->addRegisterUsageLinkedToShaderBindingTable(
  209. DX12_SHADER_REGISTER_T_SHADER_RESOURCE, 1, 4);
  210. sbtSimpleBlocksIndexOffsetBufferOffset
  211. = simpleBlocksHitSignature
  212. ->addRegisterUsageLinkedToShaderBindingTable(
  213. DX12_SHADER_REGISTER_T_SHADER_RESOURCE, 1, 5);
  214. sbtSimpleBlocksLightBufferOffset
  215. = simpleBlocksHitSignature
  216. ->addRegisterUsageLinkedToShaderBindingTable(
  217. DX12_SHADER_REGISTER_T_SHADER_RESOURCE, 1, 6);
  218. DX12Shader* simpleBlocksAnyHitShader
  219. = new DX12Shader(CustomSimpleBlocksAnyHitShader,
  220. sizeof(CustomSimpleBlocksAnyHitShader));
  221. DX12ShaderFunction* simpleBlocksAnyHitFunction
  222. = new DX12ShaderFunction("SimpleBlocksAnyHit",
  223. simpleBlocksHitSignature,
  224. DX12_SHADER_FUNCTION_TYPE_ANY_HIT);
  225. simpleBlocksAnyHitShader->addFunction(simpleBlocksAnyHitFunction);
  226. pipeline->addShader(simpleBlocksAnyHitShader);
  227. DX12Shader* simpleBlocksClosestHitShader
  228. = new DX12Shader(CustomSimpleBlocksClosestHitShader,
  229. sizeof(CustomSimpleBlocksClosestHitShader));
  230. DX12ShaderFunction* simpleBlocksClosestHitFunction
  231. = new DX12ShaderFunction("SimpleBlocksClosestHit",
  232. dynamic_cast<DX12ShaderSignature*>(
  233. simpleBlocksHitSignature->getThis()),
  234. DX12_SHADER_FUNCTION_TYPE_CLOSEST_HIT);
  235. simpleBlocksClosestHitShader->addFunction(
  236. simpleBlocksClosestHitFunction);
  237. pipeline->addShader(simpleBlocksClosestHitShader);
  238. simpleBlocksHitGroup = new DX12ShaderHitGroup("SimpleBlocksHitGroup");
  239. simpleBlocksHitGroup->setAnyHitShaderFunction(
  240. simpleBlocksAnyHitFunction);
  241. simpleBlocksHitGroup->setClosestHitShaderFunction(
  242. simpleBlocksClosestHitFunction);
  243. simpleBlocksHitGroup->setAttributeSize(8);
  244. simpleBlocksHitGroup->setPayloadSize(
  245. 40 * DEFAULT_MAX_TRANSPARENT_HITS + 4);
  246. pipeline->addHitGroup(simpleBlocksHitGroup);
  247. pipeline->setMaxRecursionDepth(10);
  248. }
  249. pipeline->createPipelineState(device, pfnD3D12SerializeRootSignature);
  250. }
  251. void CustomDX12API::fillShaderBindingTable(
  252. Framework::DX12ShaderBindingTable* zShaderBindingTable,
  253. Framework::Model3D* zModel,
  254. int objectIndex,
  255. const Framework::DX12BLAS* zBLAS,
  256. int& lastHitGroupIndex)
  257. {
  258. DirectX12::fillShaderBindingTable(
  259. zShaderBindingTable, zModel, objectIndex, zBLAS, lastHitGroupIndex);
  260. FactoryCraftModel* fcmdl = dynamic_cast<FactoryCraftModel*>(zModel);
  261. if (fcmdl)
  262. {
  263. fcmdl->zLightBuffer()->copyToGPU();
  264. zShaderBindingTable->setHitGroupShaderInput(lastHitGroupIndex,
  265. sbtDefaultLightBufferOffset,
  266. dynamic_cast<DX12Buffer*>(fcmdl->zLightBuffer())
  267. ->zBuffer()
  268. ->GetGPUVirtualAddress());
  269. }
  270. else
  271. {
  272. zShaderBindingTable->setHitGroupShaderInput(lastHitGroupIndex,
  273. sbtDefaultLightBufferOffset,
  274. defaultLightBuffer->zBuffer()->GetGPUVirtualAddress());
  275. }
  276. }
  277. int CustomDX12API::fillGlobalShaderParams(
  278. Cam3D* zCam, DX12TLAS* zTLAS, DX12Texture* zTarget, int startIndex)
  279. {
  280. if (World::INSTANCE)
  281. {
  282. lightInfo.dayLightFactor = World::INSTANCE->getDayLightFactor();
  283. lightInfo.dayLightDirection = World::INSTANCE->getDayLightDirection();
  284. }
  285. else
  286. {
  287. lightInfo.dayLightFactor = Vec3<float>(1.f, 1.f, 1.f);
  288. lightInfo.dayLightDirection = Vec3<float>(0.f, 0.f, -1.f);
  289. }
  290. lightInfoBuffer->setChanged();
  291. lightInfoBuffer->copyToGPU();
  292. int result
  293. = DirectX12::fillGlobalShaderParams(zCam, zTLAS, zTarget, startIndex);
  294. directCommandQueue->zCommandList()->SetComputeRootConstantBufferView(
  295. *globalLightBufferOffset,
  296. lightInfoBuffer->zBuffer()->GetGPUVirtualAddress());
  297. return result;
  298. }
  299. void CustomDX12API::renderWorld(Framework::World3D* zWorld,
  300. DX12TLAS* zTLAS,
  301. DX12ShaderBindingTable* zSBT,
  302. int& objectIndex)
  303. {
  304. Mat4<float> identity = Mat4<float>::identity();
  305. for (const Model3DCollection* collection : zWorld->getCollections())
  306. {
  307. const Dimension* dim = dynamic_cast<const Dimension*>(collection);
  308. if (dim)
  309. {
  310. for (const Chunk* chunk : dim->getChunks())
  311. {
  312. DX12ChunkData* chunkData = chunk->zDX12Data();
  313. chunkData->updateBuffers(device, directCommandQueue);
  314. if (chunkData->hasCustomBlocks())
  315. {
  316. bool changed
  317. = chunkData->wasCustomBufferChanged()
  318. || chunkData->getLastCustomObjectIndex() != objectIndex;
  319. if (changed)
  320. {
  321. chunkData->setLastCustomObjectIndex(objectIndex);
  322. D3D12_RAYTRACING_INSTANCE_DESC* desc
  323. = zTLAS->nextInstanceDesc();
  324. desc->InstanceID = objectIndex;
  325. desc->InstanceContributionToHitGroupIndex = objectIndex;
  326. desc->Flags = D3D12_RAYTRACING_INSTANCE_FLAG_NONE;
  327. desc->InstanceMask = 0xFF;
  328. desc->AccelerationStructure
  329. = chunkData->zCustomBlocksBlasBuffer()
  330. ->zBuffer()
  331. ->GetGPUVirtualAddress();
  332. Framework::Mat4<float> transform
  333. = Framework::Mat4<float>::translation(
  334. Vec3<float>((float)chunk->getCenter().x,
  335. (float)chunk->getCenter().y,
  336. 0.f));
  337. memcpy(desc->Transform, &transform, sizeof(float) * 12);
  338. }
  339. else
  340. {
  341. zTLAS->nextInstanceDesc();
  342. }
  343. int hitGroupOffset = zSBT->addHitGroup(simpleBlocksHitGroup,
  344. chunkData->getLastCustomHitGroupIndex());
  345. if (chunkData->getLastCustomHitGroupIndex()
  346. != hitGroupOffset
  347. || chunkData->wasCustomBufferChanged())
  348. {
  349. chunkData->setLastCustomHitGroupIndex(hitGroupOffset);
  350. zSBT->setHitGroupShaderInput(hitGroupOffset,
  351. sbtSimpleBlocksTextureIdBufferOffset,
  352. chunkData->zCustomBlocksTextureBuffer()
  353. ->zBuffer()
  354. ->GetGPUVirtualAddress());
  355. zSBT->setHitGroupShaderInput(hitGroupOffset,
  356. sbtSimpleBlocksIndexBufferOffset,
  357. chunkData->zCustomBlocksCombinedIndexBuffer()
  358. ->zBuffer()
  359. ->GetGPUVirtualAddress());
  360. zSBT->setHitGroupShaderInput(hitGroupOffset,
  361. sbtSimpleBlocksVertexDataBufferOffset,
  362. chunkData->zCustomBlocksVertexDataBuffer()
  363. ->zBuffer()
  364. ->GetGPUVirtualAddress());
  365. zSBT->setHitGroupShaderInput(hitGroupOffset,
  366. sbtSimpleBlocksIndexOffsetBufferOffset,
  367. chunkData->zCustomBlocksIndexOffsetBuffer()
  368. ->zBuffer()
  369. ->GetGPUVirtualAddress());
  370. zSBT->setHitGroupShaderInput(hitGroupOffset,
  371. sbtDefaultLightBufferOffset,
  372. chunkData->zCustomBlocksLightBuffer()
  373. ->zBuffer()
  374. ->GetGPUVirtualAddress());
  375. }
  376. chunkData->setCustomBufferChanged(0);
  377. ++objectIndex;
  378. }
  379. bool changed = chunkData->wasBufferChanged()
  380. || chunkData->getLastObjectIndex() != objectIndex;
  381. if (changed)
  382. {
  383. chunkData->setLastObjectIndex(objectIndex);
  384. D3D12_RAYTRACING_INSTANCE_DESC* desc
  385. = zTLAS->nextInstanceDesc();
  386. desc->InstanceID = objectIndex;
  387. desc->InstanceContributionToHitGroupIndex = objectIndex;
  388. desc->Flags = D3D12_RAYTRACING_INSTANCE_FLAG_NONE;
  389. desc->InstanceMask = 0xFF;
  390. desc->AccelerationStructure = chunkData->zBlasBuffer()
  391. ->zBuffer()
  392. ->GetGPUVirtualAddress();
  393. memcpy(desc->Transform, &identity, sizeof(float) * 12);
  394. }
  395. else
  396. {
  397. zTLAS->nextInstanceDesc();
  398. }
  399. int hitGroupOffset = zSBT->addHitGroup(
  400. chunkHitGroup, chunkData->getLastHitGroupIndex());
  401. if (chunkData->getLastHitGroupIndex() != hitGroupOffset
  402. || chunkData->wasBufferChanged())
  403. {
  404. chunkData->setLastHitGroupIndex(hitGroupOffset);
  405. zSBT->setHitGroupShaderInput(hitGroupOffset,
  406. sbtChunkIndexBufferOffset,
  407. chunkData->zBlockIndexBuffer()
  408. ->zBuffer()
  409. ->GetGPUVirtualAddress());
  410. zSBT->setHitGroupShaderInput(hitGroupOffset,
  411. sbtChunkTextureIdBufferOffset,
  412. chunkData->zTextureIdBuffer()
  413. ->zBuffer()
  414. ->GetGPUVirtualAddress());
  415. zSBT->setHitGroupShaderInput(hitGroupOffset,
  416. sbtChunkDataBufferOffset,
  417. chunkData->zChunkInfoBuffer()
  418. ->zBuffer()
  419. ->GetGPUVirtualAddress());
  420. zSBT->setHitGroupShaderInput(hitGroupOffset,
  421. sbtChunkLightBufferOffset,
  422. chunkData->zLightBuffer()
  423. ->zBuffer()
  424. ->GetGPUVirtualAddress());
  425. }
  426. chunkData->setBufferChanged(0);
  427. ++objectIndex;
  428. }
  429. }
  430. }
  431. DirectX12::renderWorld(zWorld, zTLAS, zSBT, objectIndex);
  432. }