From eeb923067ffdea8ef2680c9d9fab1669a0d96171 Mon Sep 17 00:00:00 2001 From: connellpaxton Date: Tue, 6 Feb 2024 08:26:24 -0500 Subject: [PATCH] Introduced frustum culling, learned how to correctly spell frustum --- Renderer/Renderer.cpp | 11 ++++++-- Renderer/UniformBuffer.hpp | 1 + Resources/Texture.hpp | 2 +- assets/shaders/terrain.frag | 3 ++- assets/shaders/terrain.frag.spv | Bin 2332 -> 2200 bytes assets/shaders/terrain.tesc | 44 ++++++++++++++++++++++---------- assets/shaders/terrain.tesc.spv | Bin 6400 -> 7672 bytes assets/shaders/terrain.tese | 3 ++- assets/shaders/terrain.tese.spv | Bin 4536 -> 4628 bytes assets/shaders/terrain.vert | 1 + assets/shaders/terrain.vert.spv | Bin 1836 -> 1928 bytes util/geo.hpp | 17 ++++++++++++ 12 files changed, 64 insertions(+), 18 deletions(-) create mode 100644 util/geo.hpp diff --git a/Renderer/Renderer.cpp b/Renderer/Renderer.cpp index 924129f..d1790e9 100644 --- a/Renderer/Renderer.cpp +++ b/Renderer/Renderer.cpp @@ -8,6 +8,7 @@ #include #include +#include #include #include @@ -18,6 +19,8 @@ #include + + using namespace std::string_literals; Renderer::Renderer(Window& win) : win(win) { @@ -338,7 +341,7 @@ void Renderer::draw() { const auto p = glm::perspective(glm::radians(90.0f), static_cast(sz.width) / static_cast(sz.height), 0.01f, 2000.0f); - uniform_buffer->upload(UniformData { + auto uni = UniformData{ .view = cam.view(), .proj = p, .time = time, @@ -346,7 +349,11 @@ void Renderer::draw() { .viewport = glm::vec2(viewport.width, viewport.y), .tess_factor = tess_factor, .tess_edge_size = tess_edge_size, - }); + }; + + std::memcpy(uni.frustum, frustum(p * uni.view).data(), sizeof(uni.frustum)); + + uniform_buffer->upload(uni); command_buffer->bind(*terrain_pipeline); command_buffer->command_buffer.setViewport(0, viewport); diff --git a/Renderer/UniformBuffer.hpp b/Renderer/UniformBuffer.hpp index 9b41513..851df66 100644 --- a/Renderer/UniformBuffer.hpp +++ b/Renderer/UniformBuffer.hpp @@ -18,6 +18,7 @@ struct UniformData { float pad2; glm::vec3 cam_pos; float pad3; + glm::vec4 frustum[6]; glm::vec2 viewport; float tess_factor; float tess_edge_size; diff --git a/Resources/Texture.hpp b/Resources/Texture.hpp index 8215f92..08b8058 100644 --- a/Resources/Texture.hpp +++ b/Resources/Texture.hpp @@ -27,7 +27,7 @@ struct Texture { .binding = binding, .descriptorType = vk::DescriptorType::eCombinedImageSampler, .descriptorCount = 1, - .stageFlags = vk::ShaderStageFlagBits::eFragment | vk::ShaderStageFlagBits::eTessellationEvaluation, + .stageFlags = vk::ShaderStageFlagBits::eFragment | vk::ShaderStageFlagBits::eTessellationControl | vk::ShaderStageFlagBits::eTessellationEvaluation, .pImmutableSamplers = nullptr, }; } diff --git a/assets/shaders/terrain.frag b/assets/shaders/terrain.frag index 0c72e5c..f312305 100644 --- a/assets/shaders/terrain.frag +++ b/assets/shaders/terrain.frag @@ -10,6 +10,7 @@ layout (set = 0, binding = 0) uniform Matrices { mat4 proj; float time; vec3 cam_pos; + vec4 frustum[6]; vec2 viewport; float tess_factor; float tess_edge_size; @@ -23,5 +24,5 @@ void main() { float r = length(light_pos-pos); float t = clamp(dot(L, norm), 0.0, 1.0) * 20.0/(r*r); - FragColor = vec4(norm * texture(tex, texCoord).xyz + t, 1.0); + FragColor = vec4(1.0); } \ No newline at end of file diff --git a/assets/shaders/terrain.frag.spv b/assets/shaders/terrain.frag.spv index 4ed3f7cdcd7ccd9b55671017547761c0a479182a..f41ddc0704803e00f9b9f70d9f5352fc8fbac571 100644 GIT binary patch literal 2200 zcmZQ(Qf6mhU}WHC;AL=OfB-=TCI&_Z1_o{hHZbk(6YQf`T#}+^Vrl?V!NDtbmn)1#CXd zepUun22KVBhMdgwjFR|*{9*{z!n*|&vdHF@TAR|EG0g4~DqQrFP{G5D+C`=R>SQt1M7{Fp6agaP0G!8-GBf-GJz|FwG01^Z7MHyHaco-NMKxTp5s}1Gz zLiNZ%(*Q_4NDO2iKU5ABK5`6P;IIOj3Bn+Efb0dO8<;wf7|30M&@cj}32O!x1`r<< zwjgsr?huB$1LSXzJ3xF9s2-4hQ79W^9!MTU%YYosz`y|G%Y*p}jv)1*_ym~+au3Kp z5FZp*ATf}<1~i;N=D_4ZaR-uznP&_(ufZP1HwE(-fX%lCmv4};1nCFyL2(U=2OS1> za2VS%Fff43K*k`u?HE9%FarZ9j6ixpd{DXo*)7Sy$pFd|Aa{ZIU@M^nj4#c=%;3nt z09FSw&j~6I5(AkB;)Bu=NZ5>l6`Y1Z@eSgG-1mcli2;;1Kx#qh1yp{*!U@C&r9T)S z6i%Qr2AK~kXFz;M237`8yofO{fXgaSeAzOvfYYZq0|Ns{oCjPgGB8L${R~PQAUT*` zNi2G$7#J8p;xN6^P`#iu2$Bl`mz)d?vJ4P&LGqxq08$Tf7c76dGC=4df6fbD|uwb9JgVPIeYsR4pr Cf`^p= literal 2332 zcmZQ(Qf6mhU}WHC;AQY-fB-=TCI&_Z1_o{hHZbk(6YQf`T#}+^Vrl?V!No zaQBIK_xE@Aag9$dD2OjEsmw`@&&kY7jZeueN=+`wEK3Ec<3LiEnU|bXnu4r=m4O9p zKFoer237`61_p+l%=C~vg)9bgcS&Y$DzX?TB$5+z!M3n5uz}43g$KyIg8ZTqh+2p^D+2>VNosL% zd|G01Nq!Ln8v{F7JsV6sH6=YYzBscg735xK27Zucu-lm# zF-Tnlk~&ZrgTy8viGjixB(?xa3}hcjYz2}SC~QGuYZw?9+!>g`egfIy&cFf=UnQtt zV0=*6f`mYP5E~TkF!i7`4dTP(L1Bu_2ZblHc_2Q>43IxT=7GW(q#ncGA?p0u5U=U|uVE}~1pm{X$SS$UKldh?WEe7y|#DG!^{G?1!NzH4+}Gpyeibs zAah{ypm>1U4-y9#N(>G5F!PPT<}U!7ZvifIAmIYi58{L34HTx544e$s&@cj-2i689 zV0>u?W(FGu2CzDidu*Zd5HS`85FZrJAYqU^D1C$Ug2EMKABYc%caWGF11mV5LGc4p z4|2l~1||kjx&^5P#V@Gbf`tW$4@xgEJ}4|e`5l=L%JU$;BLgb~DC~t97{KWo6eqR} zEa3DZ!oa`)66aw6l~4=}q70xCp8*`VAUT*`F)Vt;85kHq;xN4uP`#k^0g?*wrrkAW4OhGiKT7(jBMv|z`;3@)!hVjwqz^vN?YfW=^Z zP`(1Ci)N^PP@V><0g1!xQbDo{Bo8td6n-Fam^tcb=4vo7Fd&<&$-uw>QUekPnF~r^ zT2OPH7#J8p@*s0T@ciGcwo<^>f4*$or(hKhmQ62QO?c0Z^d1?dN=2g!rN9272~ Qasedwmw}PNf`O3%0E=Fa1ONa4 diff --git a/assets/shaders/terrain.tesc b/assets/shaders/terrain.tesc index 660ff06..fc7a229 100644 --- a/assets/shaders/terrain.tesc +++ b/assets/shaders/terrain.tesc @@ -6,6 +6,7 @@ layout (set = 0, binding = 0) uniform Matrices { mat4 proj; float time; vec3 cam_pos; + vec4 frustum[6]; vec2 viewport; float tess_factor; float tess_edge_size; @@ -45,22 +46,39 @@ float screen_space_tess(vec4 p0, vec4 p1) { return clamp(distance(clip0, clip1) / tess_edge_size * tess_factor, 1.0, 64.0); } +bool frustum_culling() { + /* square root of patch size */ + const float r = 8.0f; + /* ensure this is consistent with tese shader */ + vec4 fpos = gl_in[gl_InvocationID].gl_Position; + fpos.y += 15.0 * textureLod(heightmap, texCoord[0], 0.0).r; + + for(int i = 0; i < 6; i++) { + if(dot(fpos, frustum[i]) + r < 0.0) + return false; + } + return true; +} + void main() { if(gl_InvocationID == 0) { - gl_TessLevelOuter[0] = screen_space_tess(gl_in[3].gl_Position, gl_in[0].gl_Position); - gl_TessLevelOuter[1] = screen_space_tess(gl_in[0].gl_Position, gl_in[1].gl_Position); - gl_TessLevelOuter[2] = screen_space_tess(gl_in[1].gl_Position, gl_in[2].gl_Position); - gl_TessLevelOuter[3] = screen_space_tess(gl_in[2].gl_Position, gl_in[3].gl_Position); - gl_TessLevelInner[0] = mix(gl_TessLevelOuter[0], gl_TessLevelOuter[3], 0.5); - gl_TessLevelInner[1] = mix(gl_TessLevelOuter[2], gl_TessLevelOuter[1], 0.5); - - /*gl_TessLevelOuter[0] = tess_factor; - gl_TessLevelOuter[1] = tess_factor; - gl_TessLevelOuter[2] = tess_factor; - gl_TessLevelOuter[3] = tess_factor; - gl_TessLevelInner[0] = mix(gl_TessLevelOuter[0], gl_TessLevelOuter[3], 0.5); - gl_TessLevelInner[1] = mix(gl_TessLevelOuter[2], gl_TessLevelOuter[1], 0.5);*/ + /* perform frustum culling */ + if(frustum_culling()) { + gl_TessLevelOuter[0] = screen_space_tess(gl_in[3].gl_Position, gl_in[0].gl_Position); + gl_TessLevelOuter[1] = screen_space_tess(gl_in[0].gl_Position, gl_in[1].gl_Position); + gl_TessLevelOuter[2] = screen_space_tess(gl_in[1].gl_Position, gl_in[2].gl_Position); + gl_TessLevelOuter[3] = screen_space_tess(gl_in[2].gl_Position, gl_in[3].gl_Position); + gl_TessLevelInner[0] = mix(gl_TessLevelOuter[0], gl_TessLevelOuter[3], 0.5); + gl_TessLevelInner[1] = mix(gl_TessLevelOuter[2], gl_TessLevelOuter[1], 0.5); + } else { + gl_TessLevelOuter[0] = 0.0; + gl_TessLevelOuter[1] = 0.0; + gl_TessLevelOuter[2] = 0.0; + gl_TessLevelOuter[3] = 0.0; + gl_TessLevelInner[0] = 0.0; + gl_TessLevelInner[1] = 0.0; + } } gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position; diff --git a/assets/shaders/terrain.tesc.spv b/assets/shaders/terrain.tesc.spv index 1c57fa2de527fe1e2c2ffda171428c4d4b48c7a5..720e58b951b3c1b5844702ecfe5a3683eff1eb29 100644 GIT binary patch literal 7672 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 B-@X6< literal 6400 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 delta 682 zcmbQDvO}4dnMs+Qfq{{Mn}L^M#zfw9#_1bN=QG)MF)%RrCYBUsCZ`rNFfcH%F|aa# z#6aw_%+zua4HIKzU|=XH%Flv}O%7xhmISG0W?*1QPRxxj$S-DKV_*ZDz%qFvv#=~k zmX(2lp(M4qI6f^gxg@`cfsKJ3tb%RwL1uB@9*}Vi3=FIc%nZ{vKV`OO^z~q10V@E> zfHZp`IZ7EM$iTpWEXK~jz#sq?gXjY}6s~V_Bdajjn;=nyN{Ba^7#J8pCN_X|L&QLy z0f|k3iA}!9DjW*)2uNlHOa>fa5EIrgFfh0?FoWFC8&F0d_^Sw^v%9( z*36=E44hzXoeT^NAk4t|qK0Es&?u!4;P z`5I&eC_G_mCNeNEfW#*;u!8kWVqjnZ=>v&_)PSs;%)r2q!@$5Wk%5%~#Gk^zzyMMQ k5_e=^Rb>FVZ5jguLkBdn>=>9CKzxwGzYL5F77UCG0Iz^j%>V!Z diff --git a/assets/shaders/terrain.vert b/assets/shaders/terrain.vert index eaf4d57..5910cdf 100644 --- a/assets/shaders/terrain.vert +++ b/assets/shaders/terrain.vert @@ -12,6 +12,7 @@ layout (set = 0, binding = 0) uniform Matrices { mat4 proj; float time; vec3 cam_pos; + vec4 frustum[6]; vec2 viewport; float tess_factor; float tess_edge_size; diff --git a/assets/shaders/terrain.vert.spv b/assets/shaders/terrain.vert.spv index e2323788b6b01c8956c6b9e745d55993cb5b036b..68eecdb1b9cc12c9f193be66e7ae0eb465e1fbe1 100644 GIT binary patch delta 602 zcmZ3(*TK)r%%sfDz`)4B&A`i`yODQ4qo@`G1A}j3Nl|8UYB2)?0|OfaD}&bLhm6AY zAQ?sm28M#7{4BT(0|NsS0|P@zW^O977&8L{Lvmtnd_jIO!~_Ng1{MYehP0y6;*!!_ z1~vvZ29SBI3=9lqnW^Ok`9&oV{Sa|BkeR8)#qnv0$tC$k3~UVSa$pVYFp1QZ^wjv` z%&Jrd237`U2A#>ZOo!{;8CV!J!H#BN5MW?n@L*s8>jD`KvdRPG84!nofk7EcBa4Ad zN7e`OF0wulAEeI#Y&I*{Y>*gK-{keotl(e*1qn!91ClyWkbuM{Ac=v31SGZqNepBk zNQ{9I;#GNFfuT>GcbeQ!oylC8!6%{LQ8;n;8?e z8CV$j7#J8dpkX8f4KH4(m>dHa*c^2R1_lrY*$c7<6sB@eJs>d!1{MZwXw-wE(HhFv K*{sUO&IkbDtv3k( delta 466 zcmeC+U&F`C%%sfDz`)4B&A`i`y^(i6qo@W01A}j3Nl|8UYB2)?0|OfaD}%=5hm69J zAQ?sm28M#7{4BT(0|NsS0|P@zW^O977&8L{Lvmtnd_jIO0~-Sy14u6m0|P@@W@>ps zeo+ZTEkvAkaw3zkEJy_#$fVTb;`r2*^wjv`%&Jrd237`U2Cc~xnGXAUFtC8l0qJFB zU|{e7xeUZ%U|>*&(#T@$3=9kcV093EAh*NyP2R{XYzwjzB#KbU3bp~{Ban#=VBHWg zkdHuO6JTPK8Cir~K_-CA1j(#`$$&!*;-)nW3=HlJ%y3iP8CV#!7#J9opza0pH|Mf! tX0(-K-~=mEXJB9eVNhUz93}@f4#ZbrU}4aN206%TYbal9b0Zr&BLE4sE;axF diff --git a/util/geo.hpp b/util/geo.hpp new file mode 100644 index 0000000..6e35f07 --- /dev/null +++ b/util/geo.hpp @@ -0,0 +1,17 @@ +#pragma once + +#include +#include + +/* extracts frustum from projection matrix */ +static std::array frustum(const glm::mat4& mat) { + /* Left, Right, Top, Bottom, Back, Front */ + std::array ret; + + for (size_t i = 0; i < 3; i++) + for (size_t j = 0; j < 4; j++) + ret[i * 2][j] = mat[j].w + mat[j][i], + ret[i * 2 + 1][j] = mat[j].w - mat[j][i]; + + return ret; +} \ No newline at end of file