From 3a4ea2b697239d4b8f4276fd714f1a1a33ab69f4 Mon Sep 17 00:00:00 2001 From: n8vm Date: Mon, 26 Sep 2022 20:28:08 -0600 Subject: [PATCH] updating sbt record data example to also cover miss sbt data --- .../raytracingsbtdata/closesthit.rchit.spv | Bin 1184 -> 824 bytes .../shaders/glsl/raytracingsbtdata/miss.rmiss | 10 +++- .../glsl/raytracingsbtdata/miss.rmiss.spv | Bin 300 -> 724 bytes .../glsl/raytracingsbtdata/raygen.rgen | 23 ++++++-- .../glsl/raytracingsbtdata/raygen.rgen.spv | Bin 3168 -> 4080 bytes .../raytracingsbtdata/closesthit.rchit.spv | Bin 728 -> 728 bytes .../shaders/hlsl/raytracingsbtdata/miss.rmiss | 12 +++- .../hlsl/raytracingsbtdata/miss.rmiss.spv | Bin 324 -> 728 bytes .../hlsl/raytracingsbtdata/raygen.rgen | 22 +++++++- .../hlsl/raytracingsbtdata/raygen.rgen.spv | Bin 2768 -> 3324 bytes .../raytracingsbtdata/raytracingsbtdata.cpp | 52 +++++++++++------- 11 files changed, 90 insertions(+), 29 deletions(-) diff --git a/data/shaders/glsl/raytracingsbtdata/closesthit.rchit.spv b/data/shaders/glsl/raytracingsbtdata/closesthit.rchit.spv index 9a3bcd74c613ad8fb455a67362e0a6578ae67604..031bef114c0f527580c6996fa3ee38ccbe1c339e 100644 GIT binary patch literal 824 zcmYk4UrPc}5XC2TwX(7@wSR=sV<0_L1W`~B2KgW<(c7~2ccC`g)`y<@ay|A9g8CZ0 z1f8GlEw79-b7tn;bBE1l)(Ym0*tm__vi+VJ%h=0|3CmljedeDWpZam|>?d(>5k@yw z6h5NXW~zr9m@qG|R6vku|vL#tozl{8wnse%Hw)~^> zt{*)_{V2SCi0}Q!esC9FhgY%cc~>8nVV)|({GJf*xDAuD;I4nAP)JtqFzXz4#gZGu z;IYi*=)D=r(bbbNi(U?Qp*u*DIP5*yu@HDUYrpOfgAWXCt`APIQCTz91Xk7-@Trs*34BtLv#L25*a%ozBbPW|rE%6tQ3MZ@qX& F_5&<8KLY>& literal 1184 zcmYk5T~8BH5Qe88+af3k2>6LDD1IP~7ivt58a1XQ_JUYKxZ7+?!A)Qrx7!P@G~us# z=|3RBzu}FE@3TFJ>>(~HRmCS!oRGLCTa`6s75$av ze@k4Iw%rLo@9&1mFc~ND;V?Z3zmKEi_%I%%%GZ3pIEDqv6#EBOw=3$|i_+8nAj#6W z|7kc(4@Tn9^86?h-5Uu9`7Gb!Y%e+<50ny9vHSAfkGpzeHILy_naAAisDQacPev{G z;%p1ihqFF$mmKwQ%(-8inJUgTY+;ki>tto~p$#^E1{c)&&AWyxYiTop3QU6q!9lX*E zc-{wxJ^mFF$n$LW$v4IPAH;HB{WS7#i9NiPhUY9e{!AM1qKv)6`?@8?>{g>))-5ZB z_jN0ZsfG7-Hx*M?eBLc#c(1wbG{xR`#KG@qBIds_5D&R9FB2 diff --git a/data/shaders/glsl/raytracingsbtdata/miss.rmiss b/data/shaders/glsl/raytracingsbtdata/miss.rmiss index 569a38b9..36eb1b4b 100644 --- a/data/shaders/glsl/raytracingsbtdata/miss.rmiss +++ b/data/shaders/glsl/raytracingsbtdata/miss.rmiss @@ -3,7 +3,15 @@ layout(location = 0) rayPayloadInEXT vec3 hitValue; +layout(shaderRecordEXT, std430) buffer SBT { + float r; + float g; + float b; +}; + void main() { - // for now, we do nothing in the miss program + // Update the hit value to the hit record SBT data associated with this + // miss record + hitValue = vec3(r, g, b); } \ No newline at end of file diff --git a/data/shaders/glsl/raytracingsbtdata/miss.rmiss.spv b/data/shaders/glsl/raytracingsbtdata/miss.rmiss.spv index c67830c845fab718d13beec3b8dfe48fd729e1b8..8f6019c16e404cac966d617a8508fb3b05d3a170 100644 GIT binary patch literal 724 zcmY+CPfJ2k5XDEI&u3YhnOd7LTn5sjB8Y;5P{@U(NV~`D4<@9Gmn~ZL>Du)f>T9$K zIzN54?8-PZXJ*cvdwE{E5tyH{Wy{%?%}>eF_F6JwS?hHN;br?OjH8!u8b`OI$dY$Ie^sc#ou*YPz((-l9|QevCQRY87}1Py^%4C7EW6kJe4nqP*A*}JSCpgwP#W;upM&l%A-?>X{^44a zv7a3$>V#LH&kT1xW##m+$Mr~p-t3R3s+b;jyPle2@UB>SqfHsy%u+j*BHj!9TQ@k8 F{Q#7*E-3&2 delta 61 zcmcb@x`v6DnMs+Qft8Vgi-CiIYa*|&FdM^B5e5bp1_p-Q#LPS(#lShS(0j5EW58qu OCK-;u42%pGKnwsTy9xpT diff --git a/data/shaders/glsl/raytracingsbtdata/raygen.rgen b/data/shaders/glsl/raytracingsbtdata/raygen.rgen index 9aba9a27..42282dab 100644 --- a/data/shaders/glsl/raytracingsbtdata/raygen.rgen +++ b/data/shaders/glsl/raytracingsbtdata/raygen.rgen @@ -30,10 +30,23 @@ void main() float tmin = 0.001; float tmax = 10000.0; - // Initialize the hit value to the raygen SBT data - hitValue = vec3(r, g, b); - - traceRayEXT(topLevelAS, gl_RayFlagsOpaqueEXT, 0xff, 0, 0, 0, origin.xyz, tmin, direction.xyz, tmax, 0); - + // use border to demonstrate raygen record data + if (all(greaterThan(gl_LaunchIDEXT.xy, ivec2(16, 16))) && all(lessThan(gl_LaunchIDEXT.xy, gl_LaunchSizeEXT.xy - ivec2(16, 16)))) + { + // Generate a checker board pattern to trace out rays or use hit record data + ivec2 pos = ivec2(gl_LaunchIDEXT / 16); + if (((pos.x + pos.y % 2) % 2) == 0) { + // This will set hit value to either hit or miss SBT record color + traceRayEXT(topLevelAS, gl_RayFlagsOpaqueEXT, 0xff, 0, 0, 0, origin.xyz, tmin, direction.xyz, tmax, 0); + } + else { + // Set the hit value to the raygen SBT data + hitValue = vec3(r, g, b); + } + } + else { + // Set hit value to black + hitValue = vec3(0.0, 0.0, 0.0); + } imageStore(image, ivec2(gl_LaunchIDEXT.xy), vec4(hitValue, 0.0)); } diff --git a/data/shaders/glsl/raytracingsbtdata/raygen.rgen.spv b/data/shaders/glsl/raytracingsbtdata/raygen.rgen.spv index fcb3454c4d2ba4931799d5eae04ddde789f651f5..7713c044d6ab39f73cffd80ce991840ca9e822b7 100644 GIT binary patch literal 4080 zcmZ9NS#y;|5QaYz5|CAPP{aTNA`z5LMA?@F2@nY4is2AG!@+Ex91sv?Q$$eQKvZ1t z*7Cx?;FVtZ3#_vI6_!htrO)#*O&v0+H{JbqPft(J%y;VR=8ni3hGnC&k=eJ|tuZ01 z%T7S3ZJk@5-FwHfSp%Nhd<`&n zF=wEBJnz|*_f_)>Ok=T5cTZ1bcq;cc7AlNEEP5L@nhdLIINL{ZD_xQ_D4yol6S zpUouZP!Tsgn}_VLl)K%9^A=!lD)r`-QhTL;Ag@%*`5+W4Hx@qiW99s{ZGFe`%3yw* zw=V;g{v*M=j=ktA^%nIlMX#1B-Fek@8nSiRhsu?_t6J{2f$o31F}=6?slB7HOUDuT z>$4m=&_7trx5w4~fwufu-m{_OR!)0N#p?G3O$(W8+@x9G0Mgr?F zF4nPUwd-iRj(H{#W!!A$)FaiWqBSC$z%=&Z{ep9<)>rMPrCkD*b9(y!uSV~)+g`!+MchRJ$MM&1fm}8MZn?wW~8y^i~5$JJDRD) zI{d)N1)9)}HP7Rn|2q{dbO?X5YpP@^_P+Qtwq1z9Q|^!*FkjW z|2DZUJBc*zb)-Yv{%iYQ9I@v&(fP-@^8Hr`DcXV|&-<4Y8LFvHcy0`QE4PLu`Ko!ta^p$zDS}zU%S8H@%A}?}>Lt zPB`qv0I}xaXTR{DWk=eyyx@G}YuT-PlQXyesX#8)nvU+J zhhDqp^Vo92;hGWq0($M+c@bMqIE+0U_aIE=Sk!n;8e2bB2R;P zAl~Ac#K}ACi|@wyjmWcLd$OH>4y*$)|9s-)9Yg281-Aq2pD?DV#s0hr>}B8#y6c$B z_zS@M6JAYsk;Q^<s{|c-T?Z| yWvyQVYm0B-SBXR1=Dtpxc_Qwc#ML3=TX_@R`Nr#C0=ihodR_M>_?K!{f&T$W2tjB7 delta 1041 zcmZXT?QRTF7{|}dbatz(MA`(AP&Pi$G!haKQqq1wXm(4zTeP**wzMdpB>Tw)G;;y2 zL3$DHK?s+i7a;t8(>bzkB#eaN@NToQ(rAYeZi2_4 z_xa=1B+Em)*iJ?}b4F(7LoEyibth}+de!cs?yE;v) zoO-=tHvKYr1wB@7O6NqM)%6WUU$KylPRX{={b_FE zRJVYWPJk(>PIw#WkDNQ`a?XIrxr?qpa_*zc@m7)Z09}8Zs&4Zkur|5Wys@@#yaV&jDnE)_*1hPT$aty3M6%1hg zATuE5urP1|+4n^lz;fb1k{cv9`5>b+Bim$FCVx(ldA2}tw#l(f(vl$4z&s!g)WjeR K<4>N* sbt; + [shader("miss")] void main(inout Payload p) { - // for now, we do nothing in the miss program + // Update the hit value to the hit record SBT data associated with this + // miss record + p.hitValue = float3(sbt.r, sbt.g, sbt.g); } \ No newline at end of file diff --git a/data/shaders/hlsl/raytracingsbtdata/miss.rmiss.spv b/data/shaders/hlsl/raytracingsbtdata/miss.rmiss.spv index d7e842b350229189bcf477306c70e29fa03854d4..90f3c1bffdcc162fceda2d6612dc334756457d04 100644 GIT binary patch literal 728 zcmY+CUrPc}5XC3m)w0se)SkrfG4L^hC`gEeUPMKDlU3J0U@DsiKK1GP8uc}L2|B-R zm+H#w%$YfJX70sgqLwyy$IP;JsxK#R346_(Wh`Z#R?5! zoscK01+o~UKly{1F_5{MLHs;eD|W(pEpIztdL#9wLaee)XX~Cf-}uDzu-__-oqxMG zLlszNwI643jvdHxk2uF{a=Ws7sZt|XRFsmh%IG_fa9S}Z#`IAysdrDlDyu|0fMctw zKO_91w`N9J-~Fi0T`KD5t;xYXkbf7KTtOQh%Abjol_!RilShvkSHkGCJ2@~KXrpr> zCHmNvgU+YeNAkC-p{2h}*v}oW)sOCRl#e-uh{L^Oj^wrDFD^#7r5EHrB^f&KsI{cc Sy~;9bH` int2(16, 16)) && all(LaunchID.xy < LaunchSize.xy - int2(16, 16))) + { + // Generate a checker board pattern to trace out rays or use hit record data + int2 pos = int2(LaunchID.xy / 16); + if (((pos.x + pos.y % 2) % 2) == 0) { + // This will set hit value to either hit or miss SBT record color + TraceRay(rs, RAY_FLAG_FORCE_OPAQUE, 0xff, 0, 0, 0, rayDesc, payload); + } + else { + // Set the hit value to the raygen SBT data + payload.hitValue = float3(sbt.r, sbt.g, sbt.b); + } + } + else { + // Set hit value to black + payload.hitValue = float3(0.0, 0.0, 0.0); + } image[int2(LaunchID.xy)] = float4(payload.hitValue, 0.0); } diff --git a/data/shaders/hlsl/raytracingsbtdata/raygen.rgen.spv b/data/shaders/hlsl/raytracingsbtdata/raygen.rgen.spv index c9039b7bbc933ae40dc1b1f590bb3f6dc9ee08b0..7a2516cdbabbe9ae950bf6570654ed7295ca5e46 100644 GIT binary patch literal 3324 zcmZXV*>Y4>6oyZR4iHde2E`DQCO8vdp`q!}6o=)0Yw=Bv^Em@X5ntjNxvLb8E zK3dTj?=W^|9og{E$mp5Di=#z(VYF71E7hs-|M9ox@?wGfrNmot;Oy|(zS-JX-`;(@ zt@~)!=1})7&z5E1ug;h$%O=a!DS5r^paeR=BCr@N0d4%r&y!Gs?L;qED)~fSlxx-L zso`2NSEFJ|+9dG}+cn7$djJ-WU|-A?u< z%{_dhJeC(1^U8EFc6{#o^}INF`BLBT@k@<T9n8 z#)!z_NRMUMqV3)qBO+%j zx)Sy_^p+-jJNn;9(M8Ty_FMP>8{C{+skMz?_XECXU-Qe<{9i?xCq`Y*VM<@4P2A{ zXBk_7y!HJqxK4e$8Gj;IZWS{<$GDl8J&fwsd%iw4`Y>lNwmsSJYP5ZIe|xr{QC**L zFEHAdy&l4L@BCIM+U|?r0!7=k`Yz4ac3r+3YiPR;*W_Blb`QgLEqqW-H)OBAD0&9nT2;JJ}>8OYCC18wDoO6Z<-{oPT|Ks#dk0j3b8u>@j zttph|{C;fxpQZd`=+@{5UnK50x;#tE?kDa9y1Z}v7(2O_@nzs1`i6biuE%pa3G`hc z*Yh|9%vXXNK$o+(q4c%~(T&yD_=aTJm(=k7o(B4@9rM3}9`oBn%zp-5U*w)e_q!o~ zo>Shz_$rVWihZ<#@Sj6>PN9T$NJHcYt?a{nIqxD0=jCmssEXRUq%)_&=fyt^y^v zYv@;jYy3RLRnX=A?%zw?7`plTA}&XlH|`ta?EgBD_ukn5IHO|!`fh+Kuz&R-_~nc@ zf$#hXIZKl5z3W7O7nH!270c@SHuUXaYZJV8{$KL!HUVpxZ|#X>yJqj`Wa1dIKj_0A z?Z>{35#u*+3M>Y3|9x-MiI13>6ccaMm|H+TVu}>w9@&pEvp{|*-T4~2wawMn+>^ci z%4@XmIbiSZn>qGttarrzy%){4eB{ofn{U0Hz}R>*x6$=0!QDZZ^IinEkhtcz^&Xu0 o#_RWO#r=C9-8-r6o45<)+=r!%AAk-}Vb9g|TTl6mnGb+}0G-|O+W-In literal 2768 zcmZXUYf}_Q6ownvT_X||?YBw zCo6x+Pw_XT%JOgc#nShg>4PKo*1LVqdoF#tPxo|n4z6?g4(HrP_gMdoUf1dV>`mw2 zHFvv$t5#-auZ>U5M#0K#90j$;;@oHavvwG*D1L+d$v8GqohU8E_0sVZhsnFqbulHj zO|Hki+~%~Ba|=OZ5guz!$O{Ewo$!UQUg**fepvx|vE7n`S}mLpqabcH7prm9uEp&r zygnm)>KiTLTTngD#Vf6_bhKV-ECh3*^t@JLjgNX>6?wl}upm+PT*4tkc$9cEBALo?q(U^4l#F_r5{-M(|^jBUdzE5Car*8v^_EGQ8==33LN5{^- zi07QLc6992HLmRRgfW;-pK$nY7RHsw{HWLBScACo8g6YIeip|)Vc2?OIuSUl$9iOT z*0MgqSsplI;OG;1jN2iZx{JaAMIh@bGKP0b-y#8y_#x#--zwk(EJiJ1luh5BsDBMx z%ns>rDROS7fGR`het)jLzA<7hZ4cOuiXK#qE{O;2W}AUl;B! zH4{fIHjv?n`OcI0?vnn!X7*AEdugv*CuDp0_VmX-9OgISIo7oO|00=q z{IT;5vOQdvj6J)DN$K!_VKt8E%y<(OfqQIcLoaT4-h8IKkM$3qssL|3)82>gA7_lu zO#!~*&tpb1xrxPAksojRmVoWNZai-UogCeoZwqRQ_p{Cl99|`1Ryi=!63m*W)U$`#- diff --git a/examples/raytracingsbtdata/raytracingsbtdata.cpp b/examples/raytracingsbtdata/raytracingsbtdata.cpp index bba736b3..46e4f43a 100644 --- a/examples/raytracingsbtdata/raytracingsbtdata.cpp +++ b/examples/raytracingsbtdata/raytracingsbtdata.cpp @@ -3,6 +3,8 @@ * * Uses the data section of each shader binding table record to color the background and geometry * +* Example by Nate Morrical (https://github.com/natevm) +* * Copyright (C) 2019-2020 by Sascha Willems - www.saschawillems.de * * This code is licensed under the MIT license (MIT) (http://opensource.org/licenses/MIT) @@ -503,16 +505,23 @@ public: /* Create the Shader Binding Tables that binds the programs and top-level acceleration structure + In this example, we embed data in each record that can be read by the device during ray tracing SBT Layout used in this sample: - /-----------\ - | raygen | - |-----------| - | miss | - |-----------| - | hit | - \-----------/ + /----------------\ + | raygen handle | + | - - - - - - - | + | raygen data | + |----------------| + | miss handle | + | - - - - - - - | + | miss data | + |----------------| + | hit handle | + | - - - - - - - | + | hit data | + \----------------/ */ void createShaderBindingTable() { @@ -526,8 +535,11 @@ public: const VkBufferUsageFlags bufferUsageFlags = VK_BUFFER_USAGE_SHADER_BINDING_TABLE_BIT_KHR | VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT; const VkMemoryPropertyFlags memoryUsageFlags = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT; + + // We allocate space for the handle (which is like lambda function pointers to call in the ray tracing pipeline) + // as well as the data to pass to those functions (which act as the variables being "captured" by those lambda functions) VK_CHECK_RESULT(vulkanDevice->createBuffer(bufferUsageFlags, memoryUsageFlags, &raygenShaderBindingTable, handleSize + sizeof(float) * 3)); - VK_CHECK_RESULT(vulkanDevice->createBuffer(bufferUsageFlags, memoryUsageFlags, &missShaderBindingTable, handleSize)); + VK_CHECK_RESULT(vulkanDevice->createBuffer(bufferUsageFlags, memoryUsageFlags, &missShaderBindingTable, handleSize + sizeof(float) * 3)); VK_CHECK_RESULT(vulkanDevice->createBuffer(bufferUsageFlags, memoryUsageFlags, &hitShaderBindingTable, handleSize + sizeof(float) * 3)); // Copy handles @@ -538,17 +550,17 @@ public: memcpy(missShaderBindingTable.mapped, shaderHandleStorage.data() + handleSizeAligned, handleSize); memcpy(hitShaderBindingTable.mapped, shaderHandleStorage.data() + handleSizeAligned * 2, handleSize); - // set raygen sbt colors - { - glm::vec3 color(1.f, 0.f, 0.f); - memcpy(((uint8_t*)(raygenShaderBindingTable.mapped)) + handleSize, &color, sizeof(glm::vec3)); - } + // Copy over raygen record data + glm::vec3 color1(0.5f, 0.5f, 0.5f); + memcpy(((uint8_t*)(raygenShaderBindingTable.mapped)) + handleSize, &color1, sizeof(glm::vec3)); - // set chit sbt colors - { - glm::vec3 color(0.f, 1.f, 0.f); - memcpy(((uint8_t*)(hitShaderBindingTable.mapped)) + handleSize, &color, sizeof(glm::vec3)); - } + // Copy over miss record data + glm::vec3 color2(1.f, 1.f, 1.f); + memcpy(((uint8_t*)(missShaderBindingTable.mapped)) + handleSize, &color2, sizeof(glm::vec3)); + + // Copy over hit group record data + glm::vec3 color3(1.f, 0.f, 0.f); + memcpy(((uint8_t*)(hitShaderBindingTable.mapped)) + handleSize, &color3, sizeof(glm::vec3)); } /* @@ -752,6 +764,8 @@ public: const uint32_t handleSizeAligned = vks::tools::alignedSize(rayTracingPipelineProperties.shaderGroupHandleSize, rayTracingPipelineProperties.shaderGroupHandleAlignment); + // Note, we add 3 * sizeof(float) to each SBT entry size to account for the data sections of these records + // that we use to store our color data VkStridedDeviceAddressRegionKHR raygenShaderSbtEntry{}; raygenShaderSbtEntry.deviceAddress = getBufferDeviceAddress(raygenShaderBindingTable.buffer); raygenShaderSbtEntry.stride = handleSizeAligned; @@ -760,7 +774,7 @@ public: VkStridedDeviceAddressRegionKHR missShaderSbtEntry{}; missShaderSbtEntry.deviceAddress = getBufferDeviceAddress(missShaderBindingTable.buffer); missShaderSbtEntry.stride = handleSizeAligned; - missShaderSbtEntry.size = handleSizeAligned; + missShaderSbtEntry.size = vks::tools::alignedSize(handleSizeAligned + 3 * sizeof(float), rayTracingPipelineProperties.shaderGroupBaseAlignment); VkStridedDeviceAddressRegionKHR hitShaderSbtEntry{}; hitShaderSbtEntry.deviceAddress = getBufferDeviceAddress(hitShaderBindingTable.buffer);