From d0ad2046066e3638ecb7e33c77cf33c76d81f315 Mon Sep 17 00:00:00 2001 From: Sascha Willems Date: Sun, 9 Apr 2023 11:37:44 +0200 Subject: [PATCH] Ray tracing texturing and alpha mapping sample --- .../shaders/glsl/raytracingtextures/anyhit.rahit | 12 ++++++++++-- .../glsl/raytracingtextures/anyhit.rahit.spv | Bin 0 -> 4412 bytes ...fferreferences.glsl => bufferreferences.glsl} | 6 ++++++ .../glsl/raytracingtextures/closesthit.rchit | 15 ++++++++++++--- .../glsl/raytracingtextures/closesthit.rchit.spv | Bin 0 -> 4520 bytes .../{_geometrytypes.glsl => geometrytypes.glsl} | 7 +++++++ data/shaders/glsl/raytracingtextures/miss.rmiss | 6 ++++++ .../glsl/raytracingtextures/miss.rmiss.spv | Bin 0 -> 368 bytes data/shaders/glsl/raytracingtextures/raygen.rgen | 8 +++++++- .../glsl/raytracingtextures/raygen.rgen.spv | Bin 0 -> 2828 bytes .../raytracingtextures/raytracingtextures.cpp | 3 +-- 11 files changed, 49 insertions(+), 8 deletions(-) create mode 100644 data/shaders/glsl/raytracingtextures/anyhit.rahit.spv rename data/shaders/glsl/raytracingtextures/{_bufferreferences.glsl => bufferreferences.glsl} (74%) create mode 100644 data/shaders/glsl/raytracingtextures/closesthit.rchit.spv rename data/shaders/glsl/raytracingtextures/{_geometrytypes.glsl => geometrytypes.glsl} (84%) create mode 100644 data/shaders/glsl/raytracingtextures/miss.rmiss.spv create mode 100644 data/shaders/glsl/raytracingtextures/raygen.rgen.spv diff --git a/data/shaders/glsl/raytracingtextures/anyhit.rahit b/data/shaders/glsl/raytracingtextures/anyhit.rahit index 22c67147..eb85aa3a 100644 --- a/data/shaders/glsl/raytracingtextures/anyhit.rahit +++ b/data/shaders/glsl/raytracingtextures/anyhit.rahit @@ -1,4 +1,10 @@ +/* Copyright (c) 2023, Sascha Willems + * + * SPDX-License-Identifier: MIT + * + */ #version 460 + #extension GL_EXT_ray_tracing : require #extension GL_GOOGLE_include_directive : require #extension GL_EXT_nonuniform_qualifier : require @@ -10,13 +16,15 @@ hitAttributeEXT vec2 attribs; layout(binding = 3, set = 0) uniform sampler2D image; -#include "_bufferreferences.glsl" -#include "_geometrytypes.glsl" +#include "bufferreferences.glsl" +#include "geometrytypes.glsl" void main() { Triangle tri = unpackTriangle(gl_PrimitiveID, 32); vec4 color = texture(image, tri.uv); + // If the alpha value of the texture at the current UV coordinates is below a given threshold, we'll ignore this intersection + // That way ray traversal will be stopped and the miss shader will be invoked if (color.a < 0.9) { ignoreIntersectionEXT; } diff --git a/data/shaders/glsl/raytracingtextures/anyhit.rahit.spv b/data/shaders/glsl/raytracingtextures/anyhit.rahit.spv new file mode 100644 index 0000000000000000000000000000000000000000..ac4bcc590cf08858a44b3934a4880327fb93ea9f GIT binary patch literal 4412 zcmZ{m+mjr16~}wCm#pC$0>KEx-2_M!hy+6bV@SBfO(d8l8$%Sd(>vR<+h%rV=$Q$- zh>}3$VihQe7p`*A;?+mref2-^QGMeX#VRd7pPt_@v|D9wojT`y&-HiCuX}cM-S+j# z*hq3oGMRjo44;k3I`kxwKeKVj|9W+jY)C$r%*~!mA3A(I?JlkMibmE-d;LzCE#~R` zpxMkzd?qgXl-X+9FSAC`UL@Z{GD6OoqjN`h_4*6D_S|{9)hwh4Y}*bsK@munHXR(tBt4jv$Zq_&xGwdAf-dF722W~G{!Hf2StyHx(!OfYk%oR^j z&H9_c`ekt>xK(l2fdN#dJ%hSW0h#v(W$9Qt9a?NL)ySp1K_U&9c&1Ns>-e^05zQ9|dJgbbe z@+o9yg1kO)Df3ym+Q{2LjR!iNa>2tn2j7#d4?N$i;$FTOH&MMmi>-9FES3vz(~$>< zF~7j4o0Zve$np9b{a5IXPODP}yYFDJ%nJ{nq2?Fh6Oi}rFjeDjwxj#Z(7%}Ptg^fM zn2VyXd-93C5pxe>laMj`4dcg>FCkmcd#Zn&dCZ}|Sghv`tY@!&L;S9-htxgGHpnOH z?tB#5LR;uf3?7U;Wac zTWc%2@2)=Lx1d|&a!CK{(XW8(Bc{JI5z~K~+3@MEF#EHQ9Yk({|DAc@2X5R!xV4>ijN?_Q=BWKJ zvU%-6{b9KN>M`#e@<^~h3fJG==>K@o-K%;Q^tfZs+Juti+yU*2NPi)}c4w)+6fo^Y zkd0G+5^g>9*#CKC?^NvXLeTYp1$hLTgv_t*dmBN5^PB74O8ZRz0KM649@xtrwr_Xuce>GtDQq5fI%I0wn_u%C&e+jXc%14_%_9AX>&-)hS zS?{Cc4E{Ex&o)ROclr(_eu}Pk!hZ`HC+^vujk)bxo4MTadyts#zPX&^`_OyPAMx=% ze+Y>=&wr5P_i&$o;jis?keD-7KD}|IlEwbbhVO>lf#>zCK7Lc~B9}9~D#*@x6J(xi z;Bgn5k>f7>hWPD|y6@+$HC=r78hu|)cXvnD=(9E5yWsC+%=#1@G%o+Plx)GX&;=cSo-4yT@a&AGsIbgj^4^%e$_UseM!HN&_c=n;)|0MapEZEk;#~^e19zFnh zhh8A3`k{b52#@dPHv%5_H-m0IacAaz5i_T={U+p0W8V)U>l6DviY(@w?fYT)w;zzc_Rnm%W4XShIm_&A6)tWU&~pO|1TYc$aRMNc=f`)LT#!5|44q$i}&&7}rJ?k8vGjW5r`!7kO>HC&0v`PZ@mbxqD#Z zv)r>w;C;ya#%gm`e#gY)Ob5turtZv{*sHrZ3u(9JlkgSD`1%}H1O5s=#ykZXCmw73 z5INQ`f4#=j=-OkAA0b<#ey$&*i^m$zAR8xsKGZ#jY;A3^?z70T?s?>T-RID?$GSg3 zw(bQe?&^7D@mTi-WaGqR-4~J1LE6maJ$(tXuJxR`x_;)p68=+2`+vBn%KkR~7w9jz A(f|Me literal 0 HcmV?d00001 diff --git a/data/shaders/glsl/raytracingtextures/_bufferreferences.glsl b/data/shaders/glsl/raytracingtextures/bufferreferences.glsl similarity index 74% rename from data/shaders/glsl/raytracingtextures/_bufferreferences.glsl rename to data/shaders/glsl/raytracingtextures/bufferreferences.glsl index a2d98b01..6fa238ed 100644 --- a/data/shaders/glsl/raytracingtextures/_bufferreferences.glsl +++ b/data/shaders/glsl/raytracingtextures/bufferreferences.glsl @@ -1,3 +1,9 @@ +/* Copyright (c) 2023, Sascha Willems + * + * SPDX-License-Identifier: MIT + * + */ + layout(push_constant) uniform BufferReferences { uint64_t vertices; uint64_t indices; diff --git a/data/shaders/glsl/raytracingtextures/closesthit.rchit b/data/shaders/glsl/raytracingtextures/closesthit.rchit index 3808018c..b852d968 100644 --- a/data/shaders/glsl/raytracingtextures/closesthit.rchit +++ b/data/shaders/glsl/raytracingtextures/closesthit.rchit @@ -1,4 +1,11 @@ +/* Copyright (c) 2023, Sascha Willems + * + * SPDX-License-Identifier: MIT + * + */ + #version 460 + #extension GL_EXT_ray_tracing : require #extension GL_GOOGLE_include_directive : require #extension GL_EXT_nonuniform_qualifier : require @@ -9,14 +16,16 @@ layout(location = 0) rayPayloadInEXT vec3 hitValue; hitAttributeEXT vec2 attribs; -#include "_bufferreferences.glsl" -#include "_geometrytypes.glsl" +layout(binding = 3, set = 0) uniform sampler2D image; + +#include "bufferreferences.glsl" +#include "geometrytypes.glsl" void main() { Triangle tri = unpackTriangle(gl_PrimitiveID, 32); hitValue = vec3(tri.uv, 0.0f); + // Fetch the color for this ray hit from the texture at the current uv coordinates vec4 color = texture(image, tri.uv); hitValue = color.rgb; - } diff --git a/data/shaders/glsl/raytracingtextures/closesthit.rchit.spv b/data/shaders/glsl/raytracingtextures/closesthit.rchit.spv new file mode 100644 index 0000000000000000000000000000000000000000..7c950d2717327c6357743735033932581771ffab GIT binary patch literal 4520 zcmZ{m>vLUY6^D14lQdTD6-xzYY0z`XT|Y`auEz+nGF@nOnrG5hw%!@^&3kc->#byqd70*G-B!^o z`e{}c{gu_cUo_MHdN=Q-MZ16SK-J4OW2R?kr;i^^o82yhU2o-St7zxxVo~PJesMP6 z=sEZm?PhDRSa%qsdVPNC7nA=~UiR~~gcA*Q&)@CzHgxAdIGZG6{9T58vMjRpa*K+_ zj8~ZQS@IOkyf?%f75=~2iG=kfgLXG-o{1Uu4E7%?_8$Vbmn+~!d(l>^THE2~%-80N zr>JKAtHJtZaV)r1ao2$XRHZ$Gx=#U__Xg!)ALCBki2lXuN}h=KA@n?6*)VT9%UFeb zmU^Bk^x@V1Xde6g3^wOlpNE(aqr_t@xkb6=GsfNB4;K4&E}f;NUe3MIb_{)yH$!<& z8E56w$jk(JYvNKCvU0tdw}G1XcRJ;whjR|TD_I|Sp;yJdx)C>Cy+g~bbgnE`3vbi0 z2Zk{}!l#>+*=oq~`bYG!>b+Yj`lqtipt=v%c@Ljvr`0J#jPGT!%7*|xjs27Gamc$k zLnm=xyU=~6Ig^<0v9kO7JC{dacjps*Bj#?zCLm+<8^$-1Pa|8;yQ_cPL(HMSSghw> ztY@!&Tm0T_h15OEPRJ+f-h)wSI~mL|g{H226*1PHgnTB^%_WIzx93S{q~Z;}q(i&- z)nwXM;Yo50zV@PSe)WrjZmk{YzR&uI??t!9C6NBtqhAWwM@)ZbBBuWov*D9oVfJSq zyNSFO{x{}v19IHm4rF(v?wO*GnELf_bBKG!9q=QNk9FOTn56$C+XYp9`R%D+z%j(Ag{Ytib zH{7@*aBDm37{}{V%~AUdvU%-6{b9KN>M`#;@<_0M1+Krl(f{i~cdzPM(BqCh>k^bC z=kC?MjPxh+Yj>9FD*@A91lc(CC*jspkNuxV_D;qAE(Bfw*N{h`3CR5Fz9(Wa{)fnu z6*ZDK;D4qc``2IH-)k}bt@{q-b1k>vXK*p|)t{(e#~$Cupr8HxJUEG&U;TrC9pp}X z4)21G@4-Jo#^Cxo>sKMquP*nS7j^IC>ot7_`MsbY#@`uyAM*T9qk9K_5U_iwW-fJQ z^Ej8g@p896h8RKRqfH-s5x2o#R`{eI&%|rE=Wc?g zpm+y%Ab%?0YvlABdvm~y_k8Lxejl>&w?g({{AVF?<9EYv3z+fFLtWWf+z$PVnSKuL zY~}wT?hg1t$VdB~aP9JV*1M3+@q5nV_ww_Qm}mVrIn)n8<}y~^ZG2O(z~`+f*npV;?tWHIM#-w(qdfsC_n?T5klz-J+C_U-#% zJ@2Dv)ECfV;OWQ`2I0L2>S z*$G)g{Bg+p>s|H^%45wYvNhwb7Lmnbyf(4=`{7;o-7DbVf>t1RYfit{XCUzx@KJ9; zOOSYsTSYd`9mTjdvUrT^AR8+lpcM`9(~H-Q_tN46OX?YePr_+tIb*Y9TSf; z9U#YvLES_-ptW^Au#9c&zblf4Qg1{x*IHK~BMu literal 0 HcmV?d00001 diff --git a/data/shaders/glsl/raytracingtextures/_geometrytypes.glsl b/data/shaders/glsl/raytracingtextures/geometrytypes.glsl similarity index 84% rename from data/shaders/glsl/raytracingtextures/_geometrytypes.glsl rename to data/shaders/glsl/raytracingtextures/geometrytypes.glsl index fdd5b89d..408dcce1 100644 --- a/data/shaders/glsl/raytracingtextures/_geometrytypes.glsl +++ b/data/shaders/glsl/raytracingtextures/geometrytypes.glsl @@ -1,3 +1,9 @@ +/* Copyright (c) 2023, Sascha Willems + * + * SPDX-License-Identifier: MIT + * + */ + struct Vertex { vec3 pos; @@ -9,6 +15,7 @@ struct Triangle { vec2 uv; }; +// This function will unpack our vertex buffer data into a single triangle and calculates uv coordinates Triangle unpackTriangle(uint index, int vertexSize) { Triangle tri; const uint triIndex = index * 3; diff --git a/data/shaders/glsl/raytracingtextures/miss.rmiss b/data/shaders/glsl/raytracingtextures/miss.rmiss index 25633fbe..5165170c 100644 --- a/data/shaders/glsl/raytracingtextures/miss.rmiss +++ b/data/shaders/glsl/raytracingtextures/miss.rmiss @@ -1,3 +1,9 @@ +/* Copyright (c) 2023, Sascha Willems + * + * SPDX-License-Identifier: MIT + * + */ + #version 460 #extension GL_EXT_ray_tracing : enable diff --git a/data/shaders/glsl/raytracingtextures/miss.rmiss.spv b/data/shaders/glsl/raytracingtextures/miss.rmiss.spv new file mode 100644 index 0000000000000000000000000000000000000000..88ae284c9b1aec2ebc262061a53d77544180f5c5 GIT binary patch literal 368 zcmY*VO-lk%6g|#&P8wq5R%uyCi;^I47Zdarks|Gehe{3TET(bcs$bVm|3bgRP0%@$ zf!)X9-gED{XD;J9=OMfrVnk@*H(GG;(E{oSFnXG#j}OmjVb^I{*lCu(QX8N~X<|mE z|6b1e*Ed(%Y{IP!G&`Z@^Azw{FKw1|!-%i8fv2)2kd&)n}{&_PRue4k5F+uIiFU%wN1o{kuJvuX-2c($)#ZACFmYH)eRr hsrHTuX#~v%yiIrLUWLB3W5;J6lF45?-~3~@#1AV2Bo6=p literal 0 HcmV?d00001 diff --git a/data/shaders/glsl/raytracingtextures/raygen.rgen b/data/shaders/glsl/raytracingtextures/raygen.rgen index b6cefb8a..a3e99dc6 100644 --- a/data/shaders/glsl/raytracingtextures/raygen.rgen +++ b/data/shaders/glsl/raytracingtextures/raygen.rgen @@ -1,3 +1,9 @@ +/* Copyright (c) 2023, Sascha Willems + * + * SPDX-License-Identifier: MIT + * + */ + #version 460 #extension GL_EXT_ray_tracing : enable @@ -28,5 +34,5 @@ void main() traceRayEXT(topLevelAS, gl_RayFlagsNoneEXT, 0xff, 0, 0, 0, origin.xyz, tmin, direction.xyz, tmax, 0); - imagexStore(image, ivec2(gl_LaunchIDEXT.xy), vec4(hitValue, 0.0)); + imageStore(image, ivec2(gl_LaunchIDEXT.xy), vec4(hitValue, 0.0)); } diff --git a/data/shaders/glsl/raytracingtextures/raygen.rgen.spv b/data/shaders/glsl/raytracingtextures/raygen.rgen.spv new file mode 100644 index 0000000000000000000000000000000000000000..e39633f5be19f43d666197c56850ebbb6319bf4d GIT binary patch literal 2828 zcmZ9N+j10D6oz*u$pj&QfpAj92^dj{;UFM_kP|S88O=aKL?I5%q@6UCIaH^KNKvI0 zH(pugBYCA4K7m!fhc}k~-=4iv&Fs`aYps8;!#=G}f8o@S8|ZU;+%EUTb;pP+xF1HG z+wF>Oxw=|goWEO3qwi~38r73lL%v1VC)aXixiYzxtxsOObdJb~7=`wh5p$#$AF z*a2~;WzR*;IE|`lyA!8b5^sr8<)WWM-%jH17FyeJx)ty6oJl8bKQW#idAOH7!tbM9n>)h(L-xGp*)wBMnAfk_r#$;AHze+L@7IlE-}yLf z;-&@51!r+(oeTMS53G$dIw>&B9+PhK>@Po$%{&8t_L`r^W}cb{m4!TGs>#bmKP;^% zSrU#Yo^@d}SCYL;5)K@az1#Ep(ZHW`gCigQ!;;j3zZPuH8xH?{lK7MVjBIKh5HzMH zbaK==D8K>B!5xvqVopfcm^QoQ%^#A&D>fY<*{?GbXeW*1-n^&QOw$FS$MvEH`I$SzwU+ zV@dW>6!2&Ms(?RxpOs{e`>@&->FonAubTaZY&U)UHu;vM{-t+M9DBv4uiz$>3I2{? z>qP!NT5xwIiC2sHflWL%Z<1l_<0JH+a7(xvitfbOyEmSY~C@0J=P^T zCt@z^%~-5Vzwdv<(1XPCe)(>4W@htk%-ekb%;v3(_t+PD?5Uj1eJu9ae5c5FUG?dM z{Q^C(B$oHj_W}+uIE#*aiP66yKmSwc1zm&Z=!qNJ9eaTzH~xnOIIDG3I=y1Gj!B0D zjC`#(WHbMBsP(3F^1)M!bAq#4Z%K#yCHTKB9gbeC25wAxDd1(`PRhoYIr4Jea5I{x zS3VTzFM5bt^v$FI|EqlHm-B(6Z^*$N!C8)r(#b*ZSdL55;ql>~t_akopYY)wej>n| z&o$}z&{O8~sdV_NPMoz|7l?x|1=u=o$fhnntdq9`XX~7n-n-Wsaq!e5|C~VFl3wqu zQngz7_X`m0+{yFNJZz_Iy8Z@C@6t-N{$tsAXsNwRF~D z@eicK0Y-29LvgHcZDiQ5g*UM(APua6I^@EiJy35=@{v#rHa#8*dj;#e$AN=qQ2&Ku z>yqmN^W>V9jD_y`bnorkz)9@fTO)Afv3uJHT>jn?am3@#Joi>tokx(shaderStages.size()) - 1; shaderGroup.intersectionShader = VK_SHADER_UNUSED_KHR; - // @todo: comment + // This group also uses an anyhit shader for doing transparency (see anyhit.rahit for details) shaderStages.push_back(loadShader(getShadersPath() + "raytracingbasic/anyhit.rahit.spv", VK_SHADER_STAGE_ANY_HIT_BIT_KHR)); shaderGroup.anyHitShader = static_cast(shaderStages.size()) - 1; shaderGroups.push_back(shaderGroup);