From 3da43d5a695d5d3c2c630c433c87f1c6f729434c Mon Sep 17 00:00:00 2001 From: Avery Date: Wed, 16 Apr 2025 16:43:43 +0200 Subject: [PATCH] Seperate shader for skybox, shader and cube in one scene --- .gitignore | 1 + Makefile | 6 +- flake.nix | 1 + shaders/{frag.frag => cube.frag} | 6 +- shaders/{vert.vert => cube.vert} | 3 +- shaders/frag.spv | Bin 892 -> 0 bytes shaders/skybox.frag | 10 + shaders/skybox.vert | 157 ++++++++++++++++ shaders/vert.spv | Bin 4760 -> 0 bytes src/main.rs | 313 ++++++++++++++++++------------- 10 files changed, 358 insertions(+), 139 deletions(-) rename shaders/{frag.frag => cube.frag} (63%) rename shaders/{vert.vert => cube.vert} (98%) delete mode 100644 shaders/frag.spv create mode 100644 shaders/skybox.frag create mode 100644 shaders/skybox.vert delete mode 100644 shaders/vert.spv diff --git a/.gitignore b/.gitignore index ea8c4bf..e065db9 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ /target +/shaders/*.spv diff --git a/Makefile b/Makefile index 239f7f3..2260bea 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ BIN = target/debug/mineclone -SHADERS = shaders/vert.spv shaders/frag.spv +SHADERS = $(shell find shaders -name '*.frag' -or -name '*.vert' | sed -e 's/\.frag/_frag.spv/' -e 's/\.vert/_vert.spv/') SOURCES = $(shell find src -name '*.rs') all: $(SHADERS) $(BIN) @@ -11,8 +11,8 @@ run: all $(BIN): $(SOURCES) cargo build -%.spv: %.vert +%_vert.spv: %.vert glslc $< -o $@ -%.spv: %.frag +%_frag.spv: %.frag glslc $< -o $@ diff --git a/flake.nix b/flake.nix index 24242cb..29a02a7 100644 --- a/flake.nix +++ b/flake.nix @@ -26,6 +26,7 @@ vulkan-headers vulkan-loader vulkan-validation-layers # maybe? + shaderc # glm and whatnot … ]; }; diff --git a/shaders/frag.frag b/shaders/cube.frag similarity index 63% rename from shaders/frag.frag rename to shaders/cube.frag index 3b185db..d980196 100644 --- a/shaders/frag.frag +++ b/shaders/cube.frag @@ -1,7 +1,6 @@ #version 450 // vim: ft=c -// -layout(binding = 1) uniform samplerCube combined_image; +// clang-format off layout(location = 0) out vec4 outColor; @@ -13,8 +12,7 @@ layout(push_constant, std430) uniform pc { }; void main() { - outColor = texture(combined_image, vec3(pos_pre)); - // outColor = vec4(data.rgb*(1.0+dot(normal.xyz, normalize(vec3(-0.7, -0.5, -0.1))))/2.0, 1.0); + outColor = vec4(data.rgb*(1.0+dot(normal.xyz, normalize(vec3(-0.7, -0.5, -0.1))))/2.0, 1.0); //if(pos_post.z <= 0.0) { // outColor = vec4(1.0); //} diff --git a/shaders/vert.vert b/shaders/cube.vert similarity index 98% rename from shaders/vert.vert rename to shaders/cube.vert index b8b3a04..6a0402f 100644 --- a/shaders/vert.vert +++ b/shaders/cube.vert @@ -1,5 +1,6 @@ #version 450 // vim: ft=c +// clang-format off struct PosNorm { vec4 pos; @@ -91,7 +92,7 @@ void main() { // apply view's origin transformation //gl_Position.xyz += cam_orig.xyz; - // gl_Position *= view_orig; + gl_Position *= view_orig; // apply view's xz rotation //mat2 xz_rot; diff --git a/shaders/frag.spv b/shaders/frag.spv deleted file mode 100644 index 94a38d774cb7746b2374f6adf3ba6ab8ae55b6ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 892 zcmYk3%Syvw5QRr$YQ0vi_lj7%7Z)mm=td+i3MwvKhL{8iq)lm~;OqHRZUoQwx77?x zCv)a<&Oh~LJM(5Uwqz@IU}IaiSs^B@=3>x&?w*Xw^wG4fCv@hDkO|<1+h5>8n@z zvVNSuC)EaD9aV1Me8*qBm$yY;3`HlTrq`LpMekMXlQ8Q=Z`#c)ItRrl91K&Jqq$!U zdr?l^vpwpuX@l>+m0A*&5s`X}4_TmHy!+5);~dVmoI6n`KbB+UaMM4n!~H)$=H_1a z74D95{)DD3Nv-X!YVLbm-!)-J@*VBx=H%SxNWXPO{yFfgNseZ)J*i(*q@TQM=)+p7 zEGg2*zGXle82iY1BSyWU$n2DloHv7^Z$oj)$2@gzK>bi$+@4u>?JJ@cj9zkX4|bvZ za0}jvq5oTmuXrsKeXDY`k+XAMj+Q5Np`kg!6#lTy35K3&-_`_!?@^PyVO!2T{nTHy U6OJ7@ywq=`3awy2df}z~7c8_u5dZ)H diff --git a/shaders/skybox.frag b/shaders/skybox.frag new file mode 100644 index 0000000..63315d9 --- /dev/null +++ b/shaders/skybox.frag @@ -0,0 +1,10 @@ +#version 450 +// vim: ft=c + +layout(binding = 1) uniform samplerCube combined_image; + +layout(location = 0) out vec4 outColor; + +layout(location = 0) in vec4 pos_pre; + +void main() { outColor = texture(combined_image, vec3(pos_pre)); } diff --git a/shaders/skybox.vert b/shaders/skybox.vert new file mode 100644 index 0000000..4616c0c --- /dev/null +++ b/shaders/skybox.vert @@ -0,0 +1,157 @@ +#version 450 +// vim: ft=c +// clang-format off + +const vec4 positions[36] = vec4[36]( + // BOTTOM + vec4(-0.5, 0.5, -0.5, 1.0), + vec4(0.5, 0.5, 0.5, 1.0), + vec4(-0.5, 0.5, 0.5, 1.0), + vec4(0.5, 0.5, -0.5, 1.0), + vec4(0.5, 0.5, 0.5, 1.0), + vec4(-0.5, 0.5, -0.5, 1.0), + + // TOP + vec4(0.5, -0.5, 0.5, 1.0), + vec4(-0.5, -0.5, -0.5, 1.0), + vec4(-0.5, -0.5, 0.5, 1.0), + vec4(0.5, -0.5, 0.5, 1.0), + vec4(0.5, -0.5, -0.5, 1.0), + vec4(-0.5, -0.5, -0.5, 1.0), + + // FRONT + vec4(-0.5, -0.5, -0.5, 1.0), + vec4(0.5, 0.5, -0.5, 1.0), + vec4(-0.5, 0.5, -0.5, 1.0), + vec4(0.5, -0.5, -0.5, 1.0), + vec4(0.5, 0.5, -0.5, 1.0), + vec4(-0.5, -0.5, -0.5, 1.0), + + // BACK + vec4(0.5, 0.5, 0.5, 1.0), + vec4(-0.5, -0.5, 0.5, 1.0), + vec4(-0.5, 0.5, 0.5, 1.0), + vec4(0.5, 0.5, 0.5, 1.0), + vec4(0.5, -0.5, 0.5, 1.0), + vec4(-0.5, -0.5, 0.5, 1.0), + + // LEFT + vec4(-0.5, -0.5, -0.5, 1.0), + vec4(-0.5, 0.5, 0.5, 1.0), + vec4(-0.5, -0.5, 0.5, 1.0), + vec4(-0.5, 0.5, -0.5, 1.0), + vec4(-0.5, 0.5, 0.5, 1.0), + vec4(-0.5, -0.5, -0.5, 1.0), + + // RIGHT + vec4(0.5, 0.5, 0.5, 1.0), + vec4(0.5, -0.5, -0.5, 1.0), + vec4(0.5, -0.5, 0.5, 1.0), + vec4(0.5, 0.5, 0.5, 1.0), + vec4(0.5, 0.5, -0.5, 1.0), + vec4(0.5, -0.5, -0.5, 1.0) +); + +layout(push_constant, std430) uniform pc { + layout(offset=0) vec4 cam_orig; + layout(offset=16) vec4 cam_rot; + layout(offset=32) uvec2 screen_res; +}; + +layout (location = 0) out vec4 pos_pre; + +const float PI = 3.14159; +// Forgive me for I have sinned +const float TAU = PI*2.0; + +void main() { + // assign outs + pos_pre = positions[gl_VertexIndex]; + + // define constants + const float zFar = 100.0; + const float zNear = 0.1; + + // assign the transformee + gl_Position = positions[gl_VertexIndex]; + + mat4 fix_coordinates = mat4( + -1.0, 0.0, 0.0, 0.0, + 0.0, -1.0, 0.0, 0.0, + 0.0, 0.0, -1.0, 0.0, + 0.0, 0.0, 0.0, 1.0 + ); + mat4 view_rot_xz = mat4( + cos(cam_rot.y), 0.0, sin(cam_rot.y), 0.0, + 0.0, 1.0, 0.0, 0.0, + -sin(cam_rot.y), 0.0, cos(cam_rot.y), 0.0, + 0.0, 0.0, 0.0, 1.0 + ); + mat4 view_rot_yz = mat4( + 1.0, 0.0, 0.0, 0.0, + 0.0, cos(cam_rot.x), sin(cam_rot.x), 0.0, + 0.0, -sin(cam_rot.x), cos(cam_rot.x), 0.0, + 0.0, 0.0, 0.0, 1.0 + ); + mat4 project_aspect = mat4( + (float(screen_res.y)/float(screen_res.x)), 0.0, 0.0, 0.0, + 0.0, 1.0, 0.0, 0.0, + 0.0, 0.0, 1.0, 0.0, + 0.0, 0.0, 0.0, 1.0 + ); + mat4 project_znear = mat4( + 1.0, 0.0, 0.0, 0.0, + 0.0, 1.0, 0.0, 0.0, + 0.0, 0.0, 1.0, -zNear, + 0.0, 0.0, 0.0, 1.0 + ); + mat4 project_div = mat4( + 1.0, 0.0, 0.0, 0.0, + 0.0, 1.0, 0.0, 0.0, + 0.0, 0.0, 1.0, 0.0, + 0.0, 0.0, tan((70.0/2.0)/360.0*TAU), 0.0 + ); + mat4 project_normal = mat4( + 1.0, 0.0, 0.0, 0.0, + 0.0, 1.0, 0.0, 0.0, + 0.0, 0.0, 1.0/zFar, 0.0, + 0.0, 0.0, 0.0, 1.0 + ); + + // vulkan has inverted screen coordinates + // but we want regular mesh coordinates + // gl_Position.xyz *= -1.0 + gl_Position *= fix_coordinates; + + // apply view's xz rotation + //mat2 xz_rot; + //xz_rot[0] = vec2(cos(cam_rot.y), -sin(cam_rot.y)); + //xz_rot[1] = vec2(sin(cam_rot.y), cos(cam_rot.y)); + //gl_Position.xz *= inverse(xz_rot); + gl_Position *= view_rot_xz; + + // apply view's yz rotation + //mat2 yz_rot; + //yz_rot[0] = vec2(cos(cam_rot.x), -sin(cam_rot.x)); + //yz_rot[1] = vec2(sin(cam_rot.x), cos(cam_rot.x)); + //gl_Position.yz *= inverse(yz_rot); + gl_Position *= view_rot_yz; + + // aspect correction + //gl_Position.x *= (1080.0/1920.0); + gl_Position *= project_aspect; + + // z near correction + //gl_Position.z -= zNear; + gl_Position *= project_znear; + + // division by z + // has to be assigned by w so that the hardware performs the division AFTER clipping. + //gl_Position.w = (gl_Position.z*sin(140.0/360.0*TAU)); + gl_Position *= project_div; + + // z normalization + //gl_Position.z /= zFar; + gl_Position *= project_normal; + +} diff --git a/shaders/vert.spv b/shaders/vert.spv deleted file mode 100644 index 8518aa38d2a9452cf921366311c0931a394ec1cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4760 zcmZveX>$~16onhYB0rmn%s4X%NmPP@f;;Z} zzHdLl((;>CSmihWieIeqJUxBlTU465dCxuPF7MVov`p`6i=t`KoM>M3bJTnmM$^Sa z;#$+Ox9@P@`g)^({ie+uh?pO>q=CdNh-RgDhW-u}k}?j=#j<6xPFaioP1pFl5@tlR zqu#!J@4@DHlt_{b4{(5n)e!`j#uT zp+YH&@Mp_ERH+{jrIj>&QBk#0m!C^@)<6z?E^3SBHua>DRLb@I(cyuCxQ0eN8jteJ zWaPB2`AuKAHC^+uQvOI>Ys91b%l+|aa~|x2a`M$$oW@-tUvY=xS~FCxvRfl~9<)k5 zor2i5lxLnPpOhPilX2}3IZchdmA1Q-RQDwHMxk7cCpAtAZMamL)R;Ht!o$4RXdFmJ z^TkS~)}NFMjkqp87hNxYB#DpbE4AcU8ru?W)L1Px=L_a37KR+6YPmFq`NG#K4RNh0 z$2{xBS{#@2HMLM=OSG8+dg!-DW7e@bI&z(AO)P!UG=E#BTkS$UL{7%)QK6r_c_h_lQ>BE!y^zD#8QzNnP+cKYb z8m?VFXMu*T5X+q5+J)I;eCo{8NIy90;IrRwi{&rS*dd!HTbuc;gNOWu8qtU&AD{CG z<1fj4;ui~3JDfM?#k}daTw{lfhkp1gWYk+OpL1nj;M#>a6KcVsVf5+HNKJI+h2JTI zTPA;%M)JI$t1};-zSO%~7DXq2wa@+HS*J{L*UE^2w^>`4aiMPQ+92M#d#snHp1T}- zT@XtTbTsD44-9jl7d46HuH2xJePf^7vpdLqF*NpPlg3#x?kD?$&-Vq+`@Th(hxi*c zqOmX5w+qt)pYwk_^NBAB6VE)nmT_U`@4aHQ_GHF~y7%NMX@8zS|BGXv4r&mO?mamn zOdskI$DTOvq_BItk9#~L?YHiYll%T`5R2xyvhSy4?r~C>Sl4+@c=q32+uied`R<7p z);S~Jb%;eEf5hZ8a*nGt@*Blj+vm3_^!Hrg z^Scr1gBSSxR)qS*1^(&G-;v#eMe_Lu^eBt>eTi(ojPC{--veT)xm1R}Q!C-V;JePH z!eO1u)W#MVln=qQ=b_8*}YmVEQV*P(jJIEgHlKDP! zzvySJTNutdJ*@R)nsw@0yCu-9qjCRt%jnrHqXx0;2louk^WQ7XIyvufowv$Io2%Vn ze|lxpWSj|_^Y;l)mA_v+n)7cHCZFFfH0R$gJXL<5cr@qVA?$p#iR|1C2&1{)LE)+D z9TJb`dUpzYJ!sz3yM$RQ`^lUctsTyMpHryaEseRrQ9IP`$$U7Be4o=1VR}-V8pLu= zy#Huk*L}iXS9ovl7mwz3Js|9Lp*jCS;i>W;5|8HmhlRb*XwH8`c&hxocr@ofD(rkT zpHo2?&Gn87PgSod9?kXog}oj$pG7Pjo3)T~A$1*9CT@6&SOvJ9=7-P=mWIj<_;c|KqAo=9{4&#PtJS$+F> zFY7XD!Fz8S8Siz3YaEv5wOM!GNT!9lwc~+i9c`8PQ5ij{O$}n%n?a3e;4zISGCZO2 zREAG$JR{?~Nv*T8H8OwOUl8t;@x3OdP2-C)_;cC={FgG0T<5(k>^%D86X!m!2=k6P z{#9YeyU%Ol;N9n(FdVtgdtKOh^uZ_2eclk}jyV2JVaL1ATjJo|=WSs)a-H{%u=D7H zPn`R_E6jd7{ykyGyU+XL;N9l~VK{P~_o1-!=z~w3`+OwKSvvk>VaL1AC*t7U=Tl)g za-H{?u=D7HPn`RFF3de~{1?KGcb_lC!Mo2_!f@m|?`vV_(FdP6_xVPcJLvdtg&prc c--&~FpYMg?$aUTi!p@@)K5_r*>$O$(ANiSaRsaA1 diff --git a/src/main.rs b/src/main.rs index 610e245..ae2e881 100644 --- a/src/main.rs +++ b/src/main.rs @@ -36,120 +36,118 @@ const MESH_SIZE: u64 = 36 * 2 * 4 * 4; #[rustfmt::skip] const POSITIONS: [f32; 36 * 2 * 4] = [ // BOTTOM - - -0.5, 0.5, -0.5, 1.0, + -0.5, 0.5, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, - 0.5, 0.5, 0.5, 1.0, + 0.5, 0.5, 2.0, 1.0, 0.0, 1.0, 0.0, 0.0, - -0.5, 0.5, 0.5, 1.0, + -0.5, 0.5, 2.0, 1.0, 0.0, 1.0, 0.0, 0.0, - 0.5, 0.5, -0.5, 1.0, + 0.5, 0.5, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, - 0.5, 0.5, 0.5, 1.0, + 0.5, 0.5, 2.0, 1.0, 0.0, 1.0, 0.0, 0.0, - -0.5, 0.5, -0.5, 1.0, + -0.5, 0.5, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, // TOP - 0.5, -0.5, 0.5, 1.0, + 0.5, -0.5, 2.0, 1.0, 0.0, -1.0, 0.0, 0.0, - -0.5, -0.5, -0.5, 1.0, + -0.5, -0.5, 1.0, 1.0, 0.0, -1.0, 0.0, 0.0, - -0.5, -0.5, 0.5, 1.0, + -0.5, -0.5, 2.0, 1.0, 0.0, -1.0, 0.0, 0.0, - 0.5, -0.5, 0.5, 1.0, + 0.5, -0.5, 2.0, 1.0, 0.0, -1.0, 0.0, 0.0, - 0.5, -0.5, -0.5, 1.0, + 0.5, -0.5, 1.0, 1.0, 0.0, -1.0, 0.0, 0.0, - -0.5, -0.5, -0.5, 1.0, + -0.5, -0.5, 1.0, 1.0, 0.0, -1.0, 0.0, 0.0, // FRONT - -0.5, -0.5, -0.5, 1.0, + -0.5, -0.5, 1.0, 1.0, 0.0, 0.0, -1.0, 0.0, - 0.5, 0.5, -0.5, 1.0, + 0.5, 0.5, 1.0, 1.0, 0.0, 0.0, -1.0, 0.0, - -0.5, 0.5, -0.5, 1.0, + -0.5, 0.5, 1.0, 1.0, 0.0, 0.0, -1.0, 0.0, - 0.5, -0.5, -0.5, 1.0, + 0.5, -0.5, 1.0, 1.0, 0.0, 0.0, -1.0, 0.0, - 0.5, 0.5, -0.5, 1.0, + 0.5, 0.5, 1.0, 1.0, 0.0, 0.0, -1.0, 0.0, - -0.5, -0.5, -0.5, 1.0, + -0.5, -0.5, 1.0, 1.0, 0.0, 0.0, -1.0, 0.0, // BACK - 0.5, 0.5, 0.5, 1.0, + 0.5, 0.5, 2.0, 1.0, 0.0, 0.0, 1.0, 0.0, - -0.5, -0.5, 0.5, 1.0, + -0.5, -0.5, 2.0, 1.0, 0.0, 0.0, 1.0, 0.0, - -0.5, 0.5, 0.5, 1.0, + -0.5, 0.5, 2.0, 1.0, 0.0, 0.0, 1.0, 0.0, - 0.5, 0.5, 0.5, 1.0, + 0.5, 0.5, 2.0, 1.0, 0.0, 0.0, 1.0, 0.0, - 0.5, -0.5, 0.5, 1.0, + 0.5, -0.5, 2.0, 1.0, 0.0, 0.0, 1.0, 0.0, - -0.5, -0.5, 0.5, 1.0, + -0.5, -0.5, 2.0, 1.0, 0.0, 0.0, 1.0, 0.0, // LEFT - -0.5, -0.5, -0.5, 1.0, + -0.5, -0.5, 1.0, 1.0, -1.0, 0.0, 0.0, 0.0, - -0.5, 0.5, 0.5, 1.0, + -0.5, 0.5, 2.0, 1.0, -1.0, 0.0, 0.0, 0.0, - -0.5, -0.5, 0.5, 1.0, + -0.5, -0.5, 2.0, 1.0, -1.0, 0.0, 0.0, 0.0, - -0.5, 0.5, -0.5, 1.0, + -0.5, 0.5, 1.0, 1.0, -1.0, 0.0, 0.0, 0.0, - -0.5, 0.5, 0.5, 1.0, + -0.5, 0.5, 2.0, 1.0, -1.0, 0.0, 0.0, 0.0, - -0.5, -0.5, -0.5, 1.0, + -0.5, -0.5, 1.0, 1.0, -1.0, 0.0, 0.0, 0.0, // RIGHT - 0.5, 0.5, 0.5, 1.0, - 1.0, 0.0, 0.0, 0.0, - 0.5, -0.5, -0.5, 1.0, + 0.5, 0.5, 2.0, 1.0, 1.0, 0.0, 0.0, 0.0, - 0.5, -0.5, 0.5, 1.0, + 0.5, -0.5, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, - 0.5, 0.5, 0.5, 1.0, + 0.5, -0.5, 2.0, 1.0, 1.0, 0.0, 0.0, 0.0, - 0.5, 0.5, -0.5, 1.0, + 0.5, 0.5, 2.0, 1.0, 1.0, 0.0, 0.0, 0.0, - 0.5, -0.5, -0.5, 1.0, + 0.5, 0.5, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, - + 0.5, -0.5, 1.0, 1.0, + 1.0, 0.0, 0.0, 0.0, ]; fn create_instance(window: &Window, entry: &Entry) -> Instance { @@ -568,6 +566,7 @@ fn setup_pipeline( frag_shader: &vk::ShaderModule, pass: &vk::RenderPass, pipe_layout: &vk::PipelineLayout, + cull_mode: vk::CullModeFlags, ) -> vk::Pipeline { let shader_stages = setup_shader_stage(&dev, *vert_shader, *frag_shader); let vert_input = vk::PipelineVertexInputStateCreateInfo::default(); @@ -575,7 +574,7 @@ fn setup_pipeline( .topology(vk::PrimitiveTopology::TRIANGLE_LIST); let rasterization = vk::PipelineRasterizationStateCreateInfo::default() .polygon_mode(vk::PolygonMode::FILL) - .cull_mode(vk::CullModeFlags::NONE) + .cull_mode(cull_mode) .front_face(vk::FrontFace::CLOCKWISE) .line_width(1.0); let multisample = vk::PipelineMultisampleStateCreateInfo::default() @@ -828,7 +827,7 @@ fn write_desc_sets( desc_sets: &Vec, mesh_buf: &vk::Buffer, image_view: vk::ImageView, - skybox_sampler: vk::Sampler + skybox_sampler: vk::Sampler, ) { let buf_info = vk::DescriptorBufferInfo::default() .buffer(*mesh_buf) @@ -912,11 +911,9 @@ fn record_commands( cmd_buf: &vk::CommandBuffer, framebuf: &vk::Framebuffer, pass: &vk::RenderPass, - layout: &vk::PipelineLayout, width: u32, height: u32, - pipe: &vk::Pipeline, - desc_sets: &Vec, + pipes: &[(vk::Pipeline, vk::PipelineLayout, &[vk::DescriptorSet])], camera: &Camera, skybox_buffer: &vk::Buffer, skybox_image: &vk::Image, @@ -947,22 +944,22 @@ fn record_commands( unsafe { let regions = (0..6) - .map(|i| { - vk::BufferImageCopy::default() - .buffer_offset(3 * 2048 * 2048 * i) - .buffer_row_length(0) - .buffer_image_height(0) - .image_offset(vk::Offset3D::default()) - .image_extent(vk::Extent3D::default().width(2048).height(2048).depth(1)) - .image_subresource( - vk::ImageSubresourceLayers::default() - .aspect_mask(vk::ImageAspectFlags::COLOR) - .mip_level(0) - .layer_count(1) - .base_array_layer(i as u32), - ) - }) - .collect::>(); + .map(|i| { + vk::BufferImageCopy::default() + .buffer_offset(3 * 2048 * 2048 * i) + .buffer_row_length(0) + .buffer_image_height(0) + .image_offset(vk::Offset3D::default()) + .image_extent(vk::Extent3D::default().width(2048).height(2048).depth(1)) + .image_subresource( + vk::ImageSubresourceLayers::default() + .aspect_mask(vk::ImageAspectFlags::COLOR) + .mip_level(0) + .layer_count(1) + .base_array_layer(i as u32), + ) + }) + .collect::>(); dev.cmd_copy_buffer_to_image( *cmd_buf, *skybox_buffer, @@ -971,25 +968,17 @@ fn record_commands( ®ions, ); dev.cmd_begin_render_pass(*cmd_buf, &render_pass_info, vk::SubpassContents::INLINE); - dev.cmd_bind_pipeline(*cmd_buf, vk::PipelineBindPoint::GRAPHICS, *pipe); - dev.cmd_bind_descriptor_sets( - *cmd_buf, - vk::PipelineBindPoint::GRAPHICS, - *layout, - 0, - desc_sets.as_ref(), - &[], - ); - dev.cmd_set_viewport_with_count( - *cmd_buf, - &[vk::Viewport::default() - .width(width as f32) - .height(height as f32)], - ); - dev.cmd_set_scissor_with_count( - *cmd_buf, - &[vk::Rect2D::default().extent(vk::Extent2D { width, height })], - ); + + let screen_res: Vec = (Vec::::from([width, height])) + .iter() + .map(|f| f.to_ne_bytes()) + .collect::>() + .into_flattened(); + let base_color: Vec = (Vec::::from([0.0, 1.0, 1.0, 1.0])) + .iter() + .map(|f| f.to_ne_bytes()) + .collect::>() + .into_flattened(); let cam_data: Vec = (Vec::::from([ camera.origin.x, camera.origin.y, @@ -1004,42 +993,54 @@ fn record_commands( .collect::>() .into_flattened(); - let screen_res: Vec = (Vec::::from([width, height])) - .iter() - .map(|f| f.to_ne_bytes()) - .collect::>() - .into_flattened(); - let base_color: Vec = (Vec::::from([0.0, 1.0, 1.0, 1.0])) - .iter() - .map(|f| f.to_ne_bytes()) - .collect::>() - .into_flattened(); + for (pipe, layout, desc_sets) in pipes { + dev.cmd_bind_pipeline(*cmd_buf, vk::PipelineBindPoint::GRAPHICS, *pipe); - dev.cmd_push_constants( - *cmd_buf, - *layout, - vk::ShaderStageFlags::VERTEX, - 0, - cam_data.as_ref(), - ); - dev.cmd_push_constants( - *cmd_buf, - *layout, - vk::ShaderStageFlags::VERTEX, - 32, - screen_res.as_ref(), - ); - dev.cmd_push_constants( - *cmd_buf, - *layout, - vk::ShaderStageFlags::FRAGMENT, - 48, - base_color.as_ref(), - ); + dev.cmd_bind_descriptor_sets( + *cmd_buf, + vk::PipelineBindPoint::GRAPHICS, + *layout, + 0, + desc_sets.as_ref(), + &[], + ); + dev.cmd_set_viewport_with_count( + *cmd_buf, + &[vk::Viewport::default() + .width(width as f32) + .height(height as f32)], + ); + dev.cmd_set_scissor_with_count( + *cmd_buf, + &[vk::Rect2D::default().extent(vk::Extent2D { width, height })], + ); + dev.cmd_push_constants( + *cmd_buf, + *layout, + vk::ShaderStageFlags::VERTEX, + 0, + cam_data.as_ref(), + ); + dev.cmd_push_constants( + *cmd_buf, + *layout, + vk::ShaderStageFlags::VERTEX, + 32, + screen_res.as_ref(), + ); + dev.cmd_push_constants( + *cmd_buf, + *layout, + vk::ShaderStageFlags::FRAGMENT, + 48, + base_color.as_ref(), + ); + + dev.cmd_draw(*cmd_buf, 36, 1, 0, 0); + } - dev.cmd_draw(*cmd_buf, 36, 1, 0, 0); dev.cmd_end_render_pass(*cmd_buf); } } @@ -1225,7 +1226,7 @@ fn main() { unsafe { std::ptr::copy(POSITIONS.as_ptr(), mesh_mem as *mut f32, POSITIONS.len()); } - + let (skybox_image, skybox_image_view, skybox_sampler) = { let qf_idxs = [rcs_queue_inx]; let create_info = vk::ImageCreateInfo::default() @@ -1243,11 +1244,13 @@ fn main() { .queue_family_indices(&qf_idxs); let image = unsafe { dev.create_image(&create_info, None) }.expect("Failed to create image"); - - let skybox_mem_size: vk::MemoryRequirements = unsafe {dev.get_image_memory_requirements(image)}; + + let skybox_mem_size: vk::MemoryRequirements = + unsafe { dev.get_image_memory_requirements(image) }; let skybox_dev_mem = mem_alloc(&dev, host_invisible_inx, skybox_mem_size.size); unsafe { - dev.bind_image_memory(image, skybox_dev_mem, 0).expect("Failed to bind image memory"); + dev.bind_image_memory(image, skybox_dev_mem, 0) + .expect("Failed to bind image memory"); } let create_info = vk::ImageViewCreateInfo::default() .image(image) @@ -1277,7 +1280,6 @@ fn main() { let sampler = unsafe { dev.create_sampler(&create_info, None) }.expect("Failed to create sampler"); - (image, image_view, sampler) }; @@ -1295,14 +1297,14 @@ fn main() { std::ptr::copy(data.as_ptr(), skybox_ptr as *mut u8, data.len()); } - let vert_shader_bin = std::fs::read("shaders/vert.spv").unwrap(); - let frag_shader_bin = std::fs::read("shaders/frag.spv").unwrap(); + let skybox_vert_shader_bin = std::fs::read("shaders/skybox_vert.spv").unwrap(); + let skybox_frag_shader_bin = std::fs::read("shaders/skybox_frag.spv").unwrap(); - let vert_shader = unsafe { + let skybox_vert_shader = unsafe { dev.create_shader_module( &vk::ShaderModuleCreateInfo { - code_size: vert_shader_bin.len(), - p_code: vert_shader_bin.as_ptr() as *const u32, + code_size: skybox_vert_shader_bin.len(), + p_code: skybox_vert_shader_bin.as_ptr() as *const u32, ..Default::default() }, None, @@ -1310,11 +1312,38 @@ fn main() { .expect("Failed to create vertex shader module") }; - let frag_shader = unsafe { + let skybox_frag_shader = unsafe { dev.create_shader_module( &vk::ShaderModuleCreateInfo { - code_size: frag_shader_bin.len(), - p_code: frag_shader_bin.as_ptr() as *const u32, + code_size: skybox_frag_shader_bin.len(), + p_code: skybox_frag_shader_bin.as_ptr() as *const u32, + ..Default::default() + }, + None, + ) + .expect("Failed to create fragment shader module") + }; + + let cube_vert_shader_bin = std::fs::read("shaders/cube_vert.spv").unwrap(); + let cube_frag_shader_bin = std::fs::read("shaders/cube_frag.spv").unwrap(); + + let cube_vert_shader = unsafe { + dev.create_shader_module( + &vk::ShaderModuleCreateInfo { + code_size: cube_vert_shader_bin.len(), + p_code: cube_vert_shader_bin.as_ptr() as *const u32, + ..Default::default() + }, + None, + ) + .expect("Failed to create vertex shader module") + }; + + let cube_frag_shader = unsafe { + dev.create_shader_module( + &vk::ShaderModuleCreateInfo { + code_size: cube_frag_shader_bin.len(), + p_code: cube_frag_shader_bin.as_ptr() as *const u32, ..Default::default() }, None, @@ -1325,7 +1354,22 @@ fn main() { let pass = setup_render_pass(&dev); let pipe_layout = setup_pipe_layout(&dev); - let pipe = setup_pipeline(&dev, &vert_shader, &frag_shader, &pass, &pipe_layout); + let skybox_pipe = setup_pipeline( + &dev, + &skybox_vert_shader, + &skybox_frag_shader, + &pass, + &pipe_layout, + vk::CullModeFlags::NONE, + ); + let cube_pipe = setup_pipeline( + &dev, + &cube_vert_shader, + &cube_frag_shader, + &pass, + &pipe_layout, + vk::CullModeFlags::FRONT, + ); let surface_loader = surface::Instance::new(&entry, &instance); let swapchain_loader = swapchain::Device::new(&instance, &dev); @@ -1341,8 +1385,6 @@ fn main() { height, ); - let desc_pool = setup_desc_pool(&dev); - let mut swap_images = make_swap_images(&dev, &swapchain, &swapchain_loader); let mut swap_views = make_swap_views(&dev, &swap_images, vk::Format::B8G8R8A8_UNORM); @@ -1351,9 +1393,17 @@ fn main() { let mut framebufs = make_framebufs(&dev, &swap_views, &depth_view, &pass, width, height); + let desc_pool = setup_desc_pool(&dev); + let desc_sets = make_desc_sets(&dev, &desc_pool); - write_desc_sets(&dev, &desc_sets, &mesh_buf, skybox_image_view, skybox_sampler); + write_desc_sets( + &dev, + &desc_sets, + &mesh_buf, + skybox_image_view, + skybox_sampler, + ); let sem_avail = make_sem(&dev); let sem_finish = make_sem(&dev); @@ -1463,11 +1513,12 @@ fn main() { &cmd_buf, &framebufs[img_inx as usize], &pass, - &pipe_layout, width, height, - &pipe, - &desc_sets, + &[ + (cube_pipe, pipe_layout, &desc_sets), + (skybox_pipe, pipe_layout, &desc_sets), + ], &camera, &skybox_buf, &skybox_image,