From 90c759b1cb24c4d093541bdc9e6d907936d4ab78 Mon Sep 17 00:00:00 2001 From: Alexander Gauggel <agauggel@uni-koblenz.de> Date: Mon, 14 Jun 2021 13:14:00 +0200 Subject: [PATCH] [#70] Voxelization now moves with camera --- .../resources/shaders/voxelInfo.inc | 4 ++++ .../resources/shaders/voxelVisualisation.vert | 9 +++++--- .../shaders/voxelVisualisation_vert.spv | Bin 3072 -> 3284 bytes .../resources/shaders/voxelization.frag | 13 ++++++----- .../resources/shaders/voxelization_frag.spv | Bin 2280 -> 2688 bytes projects/cmd_sync_test/src/main.cpp | 21 +++++++++++++----- src/vkcv/ShaderProgram.cpp | 3 ++- 7 files changed, 36 insertions(+), 14 deletions(-) create mode 100644 projects/cmd_sync_test/resources/shaders/voxelInfo.inc diff --git a/projects/cmd_sync_test/resources/shaders/voxelInfo.inc b/projects/cmd_sync_test/resources/shaders/voxelInfo.inc new file mode 100644 index 00000000..c8ef9c6c --- /dev/null +++ b/projects/cmd_sync_test/resources/shaders/voxelInfo.inc @@ -0,0 +1,4 @@ +struct VoxelInfo{ + vec3 offset; + float extent; +}; \ No newline at end of file diff --git a/projects/cmd_sync_test/resources/shaders/voxelVisualisation.vert b/projects/cmd_sync_test/resources/shaders/voxelVisualisation.vert index 270b9ac5..9884087d 100644 --- a/projects/cmd_sync_test/resources/shaders/voxelVisualisation.vert +++ b/projects/cmd_sync_test/resources/shaders/voxelVisualisation.vert @@ -1,5 +1,8 @@ #version 450 #extension GL_ARB_separate_shader_objects : enable +#extension GL_GOOGLE_include_directive : enable + +#include "voxelInfo.inc" layout(location = 0) out float passCubeHalf; @@ -9,8 +12,8 @@ layout( push_constant ) uniform constants{ layout(set=0, binding=0, r8) uniform image3D voxelImage; layout(set=0, binding=1) uniform voxelizationInfo{ - float extent; -} voxelInfo; + VoxelInfo voxelInfo; +}; void main() { @@ -21,7 +24,7 @@ void main() { int index2D = gl_VertexIndex % slicePixelCount; int y = index2D / voxelResolution; int x = index2D % voxelResolution; - vec3 position = (vec3(x, y, z) / voxelResolution - 0.5) * voxelInfo.extent + passCubeHalf; + vec3 position = (vec3(x, y, z) / voxelResolution - 0.5) * voxelInfo.extent + passCubeHalf + voxelInfo.offset; gl_Position = vec4(position, 1.0); if(imageLoad(voxelImage, ivec3(x,y,z)).x == 0){ diff --git a/projects/cmd_sync_test/resources/shaders/voxelVisualisation_vert.spv b/projects/cmd_sync_test/resources/shaders/voxelVisualisation_vert.spv index 52a320bb31926efffb96e7384f76836ca1690dec..da76418305c145be8297310747e894fcbc6a78a3 100644 GIT binary patch literal 3284 zcmZve`%@cL6vr=*1d0}{r7v4C6s>R6N-J91N}&ccN(vU=rc1KG;*yQogi?OeQAcN- z@vreO@SpNA<BZ?W?mf8E@iHgpobP$wbMM_@XmDo4xdAukj=TFVUnkt45a-~pd45^^ z5m(OeYHhtXoAz3>b5~v^V%!bEGTVe3&E#SI?gddB1>_~sXQCnf4T}G+0>kc@tJWF| zYquI{*a^BpFKnbcK`ZPwlFi+)*-P;m!>78sTCLq~G&`L}+ItX(jW}wDjaJl^SF|7E zH(KzE+ReD%Dms+pQS7Otz0g-DNYlmsX1E;0TT)#~e`Des$w3&ew6_w;WshM`wzkr+ z_aDZb!h>Ge7FKd2nvrw+#72ifFG|`zg>sZL8#yw&H<UDw<A7S!J}sWx_kwNhi#{(J zwic#I+$U{@UlN|iQ8TPZD!7>R)dcxo5Pm2kmbq`ojg7F|3lCP>t?&SR*l}<X>gA;@ zW={HpEM~~fi_1-T$z2!kBx#ft&9JijL|i%RVK+}JHQOIJ3!8<MH4|{=l;Kgkw;mm8 zXT;<-?t^TLanxCg(q7PRhDSDT7PfvIAKBO=cZo%h8og^KZ6dicSu7Z9KML>Hy9u|6 zvB`VL?dK*}&2EizQ(j+|m9uBf<jfgH|6q@bz&K}?`Bjw{jJ=STGv(Y^rcX;I4?5>u zw4-BZVdvb)$5~R(W@~i~BOe&tFnR!Ec7`E?@doIXeE2O3v00TeJ)ft<qrH*CeDtw! zkBP_uMvjyEg-;8k4)SS9W${Wz!#e4_AFykxiO&1O|BUow;@Hrqq;n32O$nuUu!?M) z0X4wLh0eUePDvjZuZWn*i(a3Q%rc!lU?<-Rabl@|PE{wp3|3s|<RRviH{eST=$s*o z{hSr25B5V(Pl#7UEP6mcpJ};H?Wc16Ci$l&GoySj!-~oKMW-G*cVs|>|J&mDGc)u% z;`ED7KX=8c!TDSL4avk`5c;t=cCaZ)+z*Sv29ftuarT6rKG1oKVB{so7b54r&Gr#U z!bUE$?@DG(s>83v&nk|0ix2&A-rOxPYWBt12N*Tc_dRx1cawb*$D-DsLb%KLPK#d@ zF&on_J*4x-igvz@MSboeeZHVGcfOJMFKGANrN>3wNA3#u?7I43E+<9U(788fMBJGj z>D-rd9=oINIp+%=6LX2r@ubIpmJd1kc99qSM~_t`gL9v5Xd=9`ipc8DNG{fWS~{53 zeMT}Ei+JV-Mm&8zD*`k9Ij{fV`+na0fD_NW!OZ_<$=qGjXC>qFlaGHzGCttMb3S0^ z&;KOFc>Xsb{udwrx@3I7iRV1QEdGjQFw?I}W<OT{4axX`6VLgBng5%Ti}7zsC*JB` zlZ+2I@!S_Mi@zZm%+B<tWH7V8Bbl0JUyuxD_FIyfiP;w=gVl8-cqdCDauSEl;%-Z( zPm6n3GML3xC4(7p$H=!VA}4n9U6IWFGWy>8z9$TS?Dihsm;8V4p(Y&LuRitz$;5-x zb6NaD(WuDku6hg{`p(DJB@>UGx_tlEL{@h~GCA4Ly0=;EN79K0=e&5&VCMgMCg<;i zp1u@;v3N6JUx~m53RuHqgW`34A?}Lb6A_O;cD|Jh$`Ocfiujh&D}A8f6Vb<{cvHl? zMIRS$iMU6mhmyHBrf*5+o-jMUFWVww@WZyLy7aUoA~$y1Pvmhi_nZ9qPRAnfUC|%v zuPx5{Tm4|$6M^ylMdlnv#1oP2>%3(8V`d$1vv1iq9wWcSb|n{MnF|=cf2oeuga4!H H&x`&Ak;?|_ literal 3072 zcmZ9NeRC646vi)Yk|J7ag+fuRDOFL?3KbAVz|vw`jW)E3FQ_3+w(a6J8?&2Q`j?J6 zIOB|;#!ujvQkh}K=eK)L-RbR|oO7P@dhb1VJ3KTq;@ly3#ErV|UB1TMkPzqK7d)R6 zf6`SlyjEYU&n9VS_Tr`UL>zU)u*^2*4rg*nzuT>_ivseh=u^?K{)WW=Qh}0t!qw`{ z`PG}vB<QvJtu$yRTdhveZ^rBQgLazWa|EB-%1W(%tJ&`Lno0T~3Yt;a4Vs;>FRySX z!0&LuFYLCXL8s_YmPfItvi3q>y;hPe4Az6CR<t42mEDNCa&9Ny4We+bm4<P5xw{c# ztH_Ft73`)#H^slKbMgM(5$xDLw%yuPf7E-yu+<=mqXDTid`5T@h3%jbs^~&IP~x)A z>8$WQ5wV=#X4JeB^wVH>x!VbL!AtH9;UVhWViv=FJ;-8)-6e6k2`{^=;=MQtv!WSR zajW9W*$Dc1TB)j(<H*=7q@r`dpSj5Ju$!)hd)gT>xs7|3Z6OMKi(!(sy6s@!#)M!S zMA5#DJu(w4dSqDIahFK0K8wu;Nb*h?{LtvfOa;d#?_t*y&Z=d%@7z?bx+Pido;X`p zP5xl?h(C9BM#M6GS~B}X=l+UzbnGnb+y^;c6H$+|VS%v>BOe&tFnR#vObkN?V@Bzf zeE2O1u`?)VdVWq4o$ZYr=A*~#o)(b<j2y@G3!fH79pn>|D&p0QO1i<kAF!*ciO&1L ze@efcUGC3|%yWR@i%#$4osj;NcvZxn&v|`RGOH^6s5rjlJEhFyUIr^J^f3`J&v*mA z)I{e_SSO`Vh*Ot->EWb!Rm7qP^vO)ib!wl^^&8}8cGz>?d&#{bnf}qKht8dYQSTjb za!`->cg2YZ$G#$to%^)<4avlx7J6G8JJ^&Y?%QIpLF8Q%rv`TVK+nIU|L^0DFz0^E z_HkDd{^X)AH98{Jah*C3c2fAZI6m~p{W2?H)QrWsTQF*(^VYyFYu30I;#k!BM+mct zFXza2j<Ya*=74_ofX+9p=zrmW&Uei0oHO4t^m$cfmc~TPA2W7MJ+Noq066-%_;C^Q zvL&5aIpML}%E29<@|c+Ro9B4e<G;y=oX?5K3;wIep7%JjbX}*xn*p=BRmsJ=)6&7L z?itBoEaEvkFyiU!MG=_kFM0hJ-}lSj2b_4$8qECpJ~6kZpOcKwLm&UTWPHGh=Wf8v ze^zoa{!Qt`|L)_@OU4JBc<vI+;^!oTnf{h!_G9%gO2!AAc<vs|{4Yx`#=k9{c&mR! zGCttMGb>;g|DI$pyVGlu!OVVLGBwS9Lo%4z-<Qmpn0;O{SVI%RTfZqHCvn&;Zb34A zTHK;!FpIk-8O(?oBi{!ia$+~%nq=n7=x6V{Bn*G-_7;{UAAAcR3IqSc$9*K3SaABS zh}T8TuGRe5W8lzFKK2vI#AD~Yd5d7=q5scBV9YmpKlhl}KK6yj4i&I3JvJoX(Cc0i z|4KwW{@D4>vCq5WUyJw-j*9359e?`Zy?-O(-PwJ7E15Yky(yV{H~pSu?wS2hh_^(< z;CD~7uDbNJE+RK}+hg0~V(w4*1>zeb@Q&zj^|vL?dZhlaZHmD7b|TNK?ud9OvVBcT lra#W{zPH)8=sS;*-(n-l#aPY-4BvlM$Lhf!>p#&I(SO_;_%8qe diff --git a/projects/cmd_sync_test/resources/shaders/voxelization.frag b/projects/cmd_sync_test/resources/shaders/voxelization.frag index 5f5d7eff..0b946fbb 100644 --- a/projects/cmd_sync_test/resources/shaders/voxelization.frag +++ b/projects/cmd_sync_test/resources/shaders/voxelization.frag @@ -1,15 +1,18 @@ #version 450 #extension GL_ARB_separate_shader_objects : enable +#extension GL_GOOGLE_include_directive : enable + +#include "voxelInfo.inc" layout(location = 0) in vec3 passPos; layout(set=0, binding=0, r8) uniform image3D voxelImage; layout(set=0, binding=1) uniform voxelizationInfo{ - float extent; -} voxelInfo; + VoxelInfo voxelInfo; +}; -vec3 worldToVoxelCoordinates(vec3 world, float voxelExtent){ - return world / voxelExtent + 0.5f; +vec3 worldToVoxelCoordinates(vec3 world, VoxelInfo info){ + return (world - info.offset) / info.extent + 0.5f; } ivec3 voxelCoordinatesToUV(vec3 voxelCoordinates, ivec3 voxelImageResolution){ @@ -17,7 +20,7 @@ ivec3 voxelCoordinatesToUV(vec3 voxelCoordinates, ivec3 voxelImageResolution){ } void main() { - vec3 voxelCoordinates = worldToVoxelCoordinates(passPos, voxelInfo.extent); + vec3 voxelCoordinates = worldToVoxelCoordinates(passPos, voxelInfo); ivec3 voxeImageSize = imageSize(voxelImage); ivec3 UV = voxelCoordinatesToUV(voxelCoordinates, voxeImageSize); if(any(lessThan(UV, ivec3(0))) || any(greaterThanEqual(UV, voxeImageSize))){ diff --git a/projects/cmd_sync_test/resources/shaders/voxelization_frag.spv b/projects/cmd_sync_test/resources/shaders/voxelization_frag.spv index 814f72aa23d799583abc63f1facb2a29f045cf3c..23871e8e9b3e7b0e7beac2ab075e400c1338c04f 100644 GIT binary patch literal 2688 zcmZvc>rNC|5XTR~42U8s7cc9wAa0@ysEBt|1k?t1c0q1lV>`_BXq#c0OgHHINn=d* z8GHi28DGJ7GV5-#8~?wabFejgl1f$m>w4-`ck{NvR%4n>yXi0`(>Qy~HX+8qM=d`k zzQg2G+$$^=j>k#)_~|nziP&YDVX3WCJ}r`=wPIKUC&zC2fT@_IW@R?!ql&bc?Zzwk zlM7RR9IO}X#U$|KC&hA5_oLOPK`DvxX~)N#oAV0S{nGlnA18lQ1HT&90>2#A<rQuQ z__byH!dj`iQO-K#<dN+wXL71;%u4h;sLs|Zk>tF^B$}vFiG$=T#!Q0eNl+7((~WjX ze-_oN<)tW1F&#zqa#+(9;-j0DvGF*mZ<Laet@I-TM=GPE<BFq~oi5($9pYi54cXgG zuk=lN%OqZkmRHi`o8ed^Ppj$vA3s6L(Pny_ZFa5rI9LecsJfAaQTi@9y~YV=&(vtd zwxsX2UX0`UC|0hVVF$J@Bbix&ak8@l`*v2XW=vRmm+(cA`gYvPkxy;pNbS~;(~g`0 z)L~X<#aWLvtDpZy&zni<#HZI>3}0v+(w?tbyqX%onvExHd8LteMshaq&5Z7;F1y<& z;>=|3JJ^7>FzyS+o8rfPInK{hT`=~Zyxi@uh~xAD$>c$&@2njiJEu!o$TOgve0j*d zlJesHqJ4_zJ446bFTG714C<54-a8-c?N$dLQ2#ruP8_x#`Ro?&7d45fu}2)t)z~YU zoZ#f>vNAca4cQzABy*hpqhxZ@2eWp4VdoBZh7;KN;oytUxYc<hFz&_fx%fVH#>~Np zJuS|xz=%cX9l)?(urmG!G@&VR>SNCy^iB~m)7F45InjA5PPZa|6CYL<W-=$@?v9w@ zymWk+A^Ib6YPN{n{fm-~c{wqxn>~`WDgw*WS<Rcih~tp&vyhxPeeni->uzr7d{a*6 zjrpdW&U;OMr+XQl_?e83Ki>}VmsJmbPQ=?>Q8&~=pHxT8`J#x~GYkBgIsY^8Tk;|P zlEuW*IBH%N(I;`_MaPdA=5|Fyo+c5s*ry2*G3*&J==fbw1a+>8_?Ocoe)uq}t0H=v z62C6uU7twjEpJ#1U*?4F?ma7+cx=oF9UF1KitxwAywK?bTS3$-A_f~io;bLR|6MZJ z2i=X`xg`Q)x8AA-yR;wze`obYi~Xg1%aS?&$OgV70%KQ@U7Z!l)N%T4$@Kl+*1aPc zA8=Rqu4M4PmCNOXf6|oc>z;_-*hze;M^6vLIrN0jeGwQvA^)q_L<XZD-s7Q&_i+9B zlIgc3J2v!H5wYh*d>^gSd1ns)w{xn^PVvu1<{Rh`QL9s&+{Ek`;ln=Re^7*<+g*Hq zu=s0R=a6*bz}+7HB$+t&klgHRzX*KZ?&5&Oz@a~FzQdBqiQV}gkvy28SJwAuVfbVJ zPj^9gGholyF;17r&7j-Le8)W^X0T7(&ETkHeB8W`Nyaa-Gx|j`*c;o!kYr-OYx1G) Lun3%<km>0Qxlj87 literal 2280 zcmZvc+fEZv6o$9b0~8UEgCc5*n1G5X0tzA`AQrR=;pAmg>7Zjuhjc0)uJpphXYdKU zGrofFWIQAq|8Hh*oeOufvex?7aj(6mO@{}w#vC#^(`Fu-_;i}XLX3frS$<W#)np>P zP~0evhK<VT#N-tsj+!P|WNVjCN;0%p_G{qhMIG`1Q!z<R%52OR6-k*EQz(|^*B45m zw_mQ88(t}VTCRBYQt<ehx6=sm$>CF2T`d%sN;~`erLgg;>XoW~%_~*>y1e`Y55MMw zpI_UlKCdJl((*|5m5y$0%!{C2t!xI{!Aq~Y7zFi-UsD_5@WJl*%<kBXA+A;ZMt<UH z{f>wq5U}*J;nf;Ka;C>&i6ooB)^?QWz#pH9VzZ{}KYoIgquF#j+sa<~iMQ^BLG^jV z5287yHN7EcPt=HGQ_-CF%VD?{gvymQ7o4yEx=fCh+HQbvMpkSbFK%B*+Kfn#?qnUg z_oy(QWltQP2mhyM%%qKp+THM9>lvb4Qx>mA2Cyc>{kOK`JU1o(%aby<5_&;(*qJjT z&a$Fizk@Mk3d#q@9^p^#XaCw_eLy;UjGcaxc698VE@dIlK(v{0&R)qGVR_MU#k05Q zY<gaLvp5)p-eP5Z2GnoP>iA*nkx#pLUUW!A&JJ-fm$Oqc`M}9>%*y1zc2P0p?-%LJ zQFmAZ`G}jbI<o^iqs+`GzDG*&@!i1iMQ3i@o!s<tNyH&H-##|t`*e$IRt8HR^!RQm zbKM&7r3N~)=5#CDy!ePRa>qpx^&ByiJJRuCCg_{u)aSc(_urCi%$vCp-5R@A%77*5 zn&wAe#Bs>?T}WD-zL@Ed$juF%U3WTf#;!Y^`LpXuoqcvX@$9tI@n@&eXH^e=S;X7i zQa98>pI1lBng3Vbf?43toySGs_|psev@GPB5VeWOgAJb{ad6_9|FnqNKb6kBZ&(ap z?t<=mo0UvFHtvCrjkq}x{@Az^I(=ZfE$R^wgAE_%a$Dr$7bJsy)?InuB@r0!|3Ni) z@4F)Kk5(^O?3?nfNap;M4SZPy#(N^WI`<?~$LaSa)AuJ^w<sAOa98(%Wbhx#<#NKm zYRdHWP(*L+4ZhT)r!{d7J>jz|0;4D7U-|-(!RUwgSQqgguD=b*^t&TFHgtBG*eMY^ zoR!Wyb8@2Vs?DyoTDe91h=^K8#mP;~aS=Y~?9vGlertAr`YZ+xy|=YaN+uS&^F1ZG zKS6J;?`dK9WB;xC=&o;egT3G!6S=;-tjzb(Eu!yUao2ZVGCpob1CsFz?7hxP2770F U7?hkBf!E|i-E$&vdP1hBKWjbJhyVZp diff --git a/projects/cmd_sync_test/src/main.cpp b/projects/cmd_sync_test/src/main.cpp index ddc6420f..132b6248 100644 --- a/projects/cmd_sync_test/src/main.cpp +++ b/projects/cmd_sync_test/src/main.cpp @@ -219,13 +219,10 @@ int main(int argc, const char** argv) { const vkcv::PipelineHandle voxelizationPipe = core.createGraphicsPipeline(voxelizationPipeConfig); struct VoxelizationInfo { + glm::vec3 offset; float extent; }; vkcv::Buffer voxelizationInfoBuffer = core.createBuffer<VoxelizationInfo>(vkcv::BufferType::UNIFORM, sizeof(VoxelizationInfo)); - const float voxelizationExtent = 10.f; - VoxelizationInfo voxelizationInfo; - voxelizationInfo.extent = voxelizationExtent; - voxelizationInfoBuffer.fill({ voxelizationInfo }); vkcv::DescriptorWrites voxelizationDescriptorWrites; voxelizationDescriptorWrites.storageImageWrites = { vkcv::StorageImageDescriptorWrite(0, voxelImage.getHandle()) }; @@ -362,6 +359,17 @@ int main(int argc, const char** argv) { const glm::mat4 viewProjectionCamera = cameraManager.getCamera().getProjection() * cameraManager.getCamera().getView(); + const float voxelizationExtent = 20.f; + VoxelizationInfo voxelizationInfo; + voxelizationInfo.extent = voxelizationExtent; + + // move voxel offset with camera in voxel sized steps + const glm::vec3 cameraPos = cameraManager.getCamera().getPosition(); + const float voxelSize = voxelizationExtent / voxelResolution; + voxelizationInfo.offset = glm::floor(cameraPos / voxelSize) * voxelSize; + + voxelizationInfoBuffer.fill({ voxelizationInfo }); + const float voxelizationHalfExtent = 0.5f * voxelizationExtent; const glm::mat4 voxelizationProjection = glm::ortho( -voxelizationHalfExtent, @@ -371,6 +379,9 @@ int main(int argc, const char** argv) { -voxelizationHalfExtent, voxelizationHalfExtent); + const glm::mat4 voxelizationView = glm::translate(glm::mat4(1.f), -voxelizationInfo.offset); + const glm::mat4 voxelizationViewProjection = voxelizationProjection * voxelizationView; + // compute positions and transform matrices std::vector<glm::vec3> instancePositions = { glm::vec3(0.f, -2.f, 0.f), @@ -398,7 +409,7 @@ int main(int argc, const char** argv) { for (const auto& m : modelMatrices) { mainPassMatrices.push_back({ viewProjectionCamera * m, m }); mvpLight.push_back(lightInfo.lightMatrix * m); - voxelizationMatrices.push_back({ voxelizationProjection * m, m }); + voxelizationMatrices.push_back({ voxelizationViewProjection * m, m }); } vkcv::PushConstantData pushConstantData((void*)mainPassMatrices.data(), 2 * sizeof(glm::mat4)); diff --git a/src/vkcv/ShaderProgram.cpp b/src/vkcv/ShaderProgram.cpp index 7c54c301..a33fa712 100644 --- a/src/vkcv/ShaderProgram.cpp +++ b/src/vkcv/ShaderProgram.cpp @@ -142,7 +142,8 @@ namespace vkcv { std::pair descriptor(comp.get_decoration(u.id, spv::DecorationDescriptorSet), DescriptorBinding(comp.get_decoration(u.id, spv::DecorationBinding), DescriptorType::UNIFORM_BUFFER, base_type.vecsize, shaderStage)); bindings.push_back(descriptor); - if (comp.get_decoration(u.id, spv::DecorationDescriptorSet) > maxSetID) maxSetID = comp.get_decoration(u.id, spv::DecorationDescriptorSet); + if ((int32_t)comp.get_decoration(u.id, spv::DecorationDescriptorSet) > maxSetID) + maxSetID = comp.get_decoration(u.id, spv::DecorationDescriptorSet); } for (uint32_t i = 0; i < resources.storage_buffers.size(); i++) { -- GitLab